模板化矢量的构造函数(数学类)

val*_*val 2 c++

对于我想要处理的小型软件渲染器项目,我需要不同类型的矢量,所以我想我会将它们模板化.

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})语法看起来也很笨重.

Jar*_*d42 5

您可以使用variadic模板:

template <typename ... Ts>
Vector(Ts&&... args) : data{{std::forward<Ts>(args)...}}
{}
Run Code Online (Sandbox Code Playgroud)

可能有一些SFINAE将此构造函数限制为良好数量的args,并且args可转换为T.