对于我想要处理的小型软件渲染器项目,我需要不同类型的矢量,所以我想我会将它们模板化。
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::array
和std::initializer_list
之间没有可接受的转换,({1, 2, 3})
语法看起来也很笨拙。
答案 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});
}