使用变量参数列表初始化表

时间:2012-06-24 16:57:30

标签: c++

在我的代码中,我希望能够做到

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,这显然不是预期的。

1 个答案:

答案 0 :(得分:3)

可变数据模板和初始化程序列表可能有效:

struct Table
{
    std::vector<double> data;

    template <typename ...Args>
    Table(Args &&... args)
    : data({std::forward<Args>(args)...})
    {  }
};