0

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

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

4

1 回答 1

3

Variadic templates and initializer lists might work:

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

    template <typename ...Args>
    Table(Args &&... args)
    : data({std::forward<Args>(args)...})
    {  }
};
于 2012-06-24T17:04:03.890 回答