3

テンプレートスキルをC++でトレーニングしていて、ベクトルクラスを実装したいと考えています。クラスはベクトル次元Nと型Tによって定義されます。次に、型Tの正確にN個の変数を受け取るコンストラクターが必要です。ただし、可変個引数テンプレートにNのみを受け入れるように指示する方法について頭を悩ませることはできません。パラメーター。たぶん、これはテンプレートの特殊化で可能ですか?それとも私は間違った方向に考えていますか?これに関する考え/アイデアをいただければ幸いです。

より多くの考え

私がすでに見た可変個引数テンプレートのすべての例では、再帰を使用してパラメーターリストを「反復」しました。ただし、コンストラクターからコンストラクターを呼び出すことはできないことを念頭に置いています(回答のコメントを読んでください)。では、コンストラクターで可変個引数テンプレートを使用することさえできないのではないでしょうか。とにかく、それは同じ基本的な問題を持つファクトリ関数の使用に私を延期するだけです。

4

1 に答える 1

8

可変引数コンストラクターが適切と思われます。

template<typename T, int Size>
struct vector {
    template<typename... U>
    explicit
    vector(U&&... u)
        : data {{ std::forward<U>(u)... }}
    {
        static_assert( sizeof...(U) == Size, "Wrong number of arguments provided" );
    }

    T data[Size];
};

この例では、コンストラクターに正確な引数が渡されstatic_assertない場合にハード エラーを生成するために、完全転送 and を使用しています。Sizeこれは微調整できます:

  • std::enable_if(トリガー SFINAE)を使用して、ハード エラーをソフト エラーに変えることができます。私はそれをお勧めしません
  • 条件を besizeof...(U) <= Sizeに変更して、残りの要素の値を初期化することができます
  • コンストラクターに渡される型が に変換可能であることT、または完全に一致することを要求できますT const&。違反をハードエラー (static_assert再使用) またはソフトエラー (SFINAE 再使用) に変える
于 2011-10-11T11:52:40.640 に答える