模板化vector(数学类型)的构造函数

Constructor of a templated vector(math kind)

本文关键字:类型 构造函数 vector      更新时间:2023-10-16

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

template<typename T, size_t dim> struct Vector {
  std::array<T, dim> data;
  Vector(){
    data = { 0 };
  }
}

对于像

这样的空向量可以很好地工作:
Vector<int, 3> v;

但是如何创建一个构造函数来接受这样的语法呢?

Vector<int, 3> v(1, 2, 3);

原以为std::initializer_list可以这样工作:

Vector(std::initializer_list<T> values){
  data = values;
}
Vector<int, 3> v({1, 2, 3});

但是编译器说在std::arraystd::initializer_list之间没有可接受的转换,({1, 2, 3})的语法看起来也有点笨拙。

您可以使用variadic模板:

template <typename ... Ts>
Vector(Ts&&... args) : data{{std::forward<Ts>(args)...}}
{}

可能会有一些SFINAE限制这个构造函数的args数量,并且args可转换为t

它不能与std::initializer_list一起工作,但它可以与std::array代理:

#include <array>
#include <iostream>
template<typename T, size_t dim> struct Vector {
  std::array<T, dim> data;
  Vector(){
    data = { 0 };
  }
  Vector(std::array<T, dim> initial_values) : data(initial_values) {}
};
int main() {
    Vector<int, 3> v({1, 2, 3});
}