对于我想要处理的小型软件渲染器项目,我需要不同类型的矢量,所以我想我会将它们模板化.
template<typename T, size_t dim> struct Vector {
std::array<T, dim> data;
Vector(){
data = { 0 };
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于空矢量,如:
Vector<int, 3> v;
Run Code Online (Sandbox Code Playgroud)
但是我怎么能创建一个接受这样的sytax的构造函数:
Vector<int, 3> v(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
认为std :: initializer_list可以像这样工作:
Vector(std::initializer_list<T> values){
data = values;
}
Vector<int, 3> v({1, 2, 3});
Run Code Online (Sandbox Code Playgroud)
但是编译器说在std::array和之间没有可接受的转换std::initializer_list,({1, 2, 3})语法看起来也很笨重.
您可以使用variadic模板:
template <typename ... Ts>
Vector(Ts&&... args) : data{{std::forward<Ts>(args)...}}
{}
Run Code Online (Sandbox Code Playgroud)
可能有一些SFINAE将此构造函数限制为良好数量的args,并且args可转换为T.