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

时间:2016-10-06 16:22:57

标签: c++

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

template<typename T, size_t dim> struct Vector {
  std::array<T, dim> data;

  Vector(){
    data = { 0 };
  }
}

这适用于空载体,如:

Vector<int, 3> v;

但是我怎么能创建一个接受这样的sytax的构造函数:

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

2 个答案:

答案 0 :(得分:5)

您可以使用variadic模板:

private void dgvRiscos_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        var senderGrid = (DataGridView)sender;
        senderGrid.EndEdit();

        if (senderGrid.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn &&
            e.RowIndex >= 0)
        {

            var cbxCell = (DataGridViewCheckBoxCell)senderGrid.Rows[e.RowIndex].Cells["associado"];
            if ((bool)cbxCell.Value)
            {
                   // Criar registo na base de dados
            }
            else
            {
                   // Remover registo da base de dados
            }
        }
    }

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

答案 1 :(得分:1)

它不适用于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});
}