在我的代码中,我希望能够做到
Table<double> tbl;
tbl.Create(2, 2, 1.0, 2.0, 3.0, 4.0);
并通过构造函数
Table<double> tbl(2, 2, 1.0, 2.0, 3.0, 4.0);
根据我的经验,使用省略号(...)会导致几个难以追踪的错误,所以我想出了以下内容来初始化我的表:
void Create(size_t rows, size_t columns, T val0)
{
ASSERT(rows * columns == 1);
Create(rows, columns);
_data[0] = val0;
}
void Create(size_t rows, size_t columns, T val0, T val1)
{
ASSERT(rows * columns == 2);
Create(rows, columns);
_data[0] = val0;
_data[1] = val1;
}
void Create(size_t rows, size_t columns, T val0, T val1, T val2)
{
ASSERT(rows * columns == 3);
Create(rows, columns);
_data[0] = val0;
_data[1] = val1;
_data[2] = val2;
}
我想你明白了。但是,如果我想要多达50个元素的函数,这会变得相当烦人。更不用说我必须编写所有这些构造函数。是不是有另一种方式来更优雅地处理这个问题?
编辑:也许我应该解释为什么我不想在这种情况下使用省略号(...)。我们考虑以下代码:
Table<double> tbl(2, 2, 1.5, 2.1, 3, 4.5);
编译器将第5个参数解释为类型int
,这显然不是预期的。
答案 0 :(得分:3)
可变数据模板和初始化程序列表可能有效:
struct Table
{
std::vector<double> data;
template <typename ...Args>
Table(Args &&... args)
: data({std::forward<Args>(args)...})
{ }
};