2

テンプレートには、特定のテンプレート タイプに対してのみ有効な関数がいくつかあります。GCC はこれに満足しているようですが、有効かどうかはわかりません。典型的な SFINAE とは異なり、関数自体はテンプレートではありません。

template<typename T>
struct generic {
  T item;
  void get_limited() {
    item.limited();
  }
};

を呼び出さないというget_limited条件で、このクラスを実装しない型でインスタンス化しても問題ありませんlimitedか?

いいえの場合、どうすればこれを解決できますか? 保存している割り当てに基づいて特定の機能が有効になる汎用コンテナー クラスがあります (上記のように型に直接ではなく、テンプレート パラメーターのままです)。

4

1 に答える 1

5

テンプレート関数はオンデマンドでインスタンス化されるため、関数を使用しない場合、少なくともいくつかの可能なインスタンス化については、正しい必要はありません。標準では、テンプレートがインスタンス化された型に対して有効でない場合プログラムがインスタンス化されていなくても、プログラムの形式が正しくありません (ただし、コンパイラはそれを診断する必要はありません) と述べています。

この機能は、標準ライブラリのさまざまな部分で使用されます。単一の関数の要件は、テンプレートがインスタンス化する型に課す一般的な要件よりも厳しい場合があります。たとえば、 の場合std::map、一般に、値の型はデフォルトで構築operator[]可能である必要はありませんが、キーが存在しない場合、その演算子は空の要素を作成する必要がある可能性があるため、使用する場合は構築可能である必要があります。 .

于 2013-08-05T13:26:57.847 に答える