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

可変個引数テンプレートと初期化子リストが機能する可能性があります。

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

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