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>只能为案例添加构造函数吗?
无法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因为这是数组中指定的内容.
您可以为构造函数定义另一个重载,然后使用委托,例如:
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)
将工作.