有没有办法从double转换为std :: array <double,1>?

Qua*_*ero 4 c++ implicit-conversion stdarray

我有这样的模板类:

template<int dimension>
class Foo{
  Foo(std::array<double, dimension>);
}
Run Code Online (Sandbox Code Playgroud)

和一个功能

func(Foo<1> f);
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样调用函数和构造函数:

func(1);
Foo<1> f(1);
Run Code Online (Sandbox Code Playgroud)

代替

func({1});
Foo<1> f({1});
Run Code Online (Sandbox Code Playgroud)

有没有一个很好的方法来实现这一目标?

如果无法进行隐式转换,那么1 Foo<1>只能为案例添加构造函数吗?

Nat*_*ica 8

无法double将a 隐式转换为a std::array<double, 1>.这将需要重载转换运算符,double但无法完成,因为您不能为内置类型重载运算符.

你可以做的是添加

Foo(double);
Run Code Online (Sandbox Code Playgroud)

构造函数,然后使用一个static_assert

static_assert(dimension == 1, "single double constructor only works if dimension == 1");
Run Code Online (Sandbox Code Playgroud)

在构造函数的主体中将其限制为仅在数组大小为的时才起作用1.(我喜欢static_assert在我可以的时候使用,因为它可以让你写一个漂亮的描述性错误信息)


您应该考虑重命名dimension,size因为这是数组中指定的内容.


lub*_*bgr 5

您可以为构造函数定义另一个重载,然后使用委托,例如:

template<int dimension>
class Foo{
  public:
    Foo(std::array<double, dimension>) {}
    Foo(double init) : Foo(std::array<double, dimension>{{init}}) {}
};
Run Code Online (Sandbox Code Playgroud)

这样,既可以进行所需的调用

func(1);
Foo<1> f(1);
Run Code Online (Sandbox Code Playgroud)

将工作.