1

std ライブラリには、特定の演算子をオーバーライドする型を必要とするクラス テンプレートの型があります。たとえば、std::map で使用する型は、< 演算子をサポートする型を必要とします。

しかし、特定の FUNCTION を要求するのは良いことでしょうか? このばかげた例を考えてみましょう

template <typename T> struct Foo {
  T t;
  Foo() {
    t.push_back(0);
  }
};

int main() {
  Foo<std::vector<int>> foo;
  return 0;
}

クラス テンプレート Foo を作成しました。その型には、push_back メンバー func が必要です。この設計は c++ コーダーに受け入れられる/一般的ですか?

4

3 に答える 3

2

あなたが説明しているものはテンプレート ポリシーと呼ばれ (これを参照)、クラスまたは関数の完全に正当で一般的な設計パターンです。

于 2013-02-12T17:51:01.457 に答える
2

もちろん。クラス テンプレートを記述するときに、テンプレート パラメーターの要件を文書化するだけです。

Tあなたの例では、実際にpush_backはデフォルトのコンストラクターが使用されている場合にのみ関数が必要であることに注意してくださいFoo<T>()。(言語に関する限り。安全のために、要件はより厳しくなる可能性があります。)

最近のコンパイラを使用している場合は、使用static_assertして、ほとんどのテンプレート パラメーターの要件が遵守されていることを確認したり、要件が遵守されていない場合のエラー メッセージをより読みやすくしたりすることもできます。

于 2013-02-12T17:53:51.400 に答える
1

はい、大丈夫です。標準は常にそれを行います。std::back_inserter例として、あなたの例のように、そのテンプレート型がpush_backメンバー関数を実装していると仮定するものを考えてみましょう。ただし、まだ概念はありませんが、要件を文書化することをお勧めします。テンプレートの種類に意味のある名前を付けることも役立ちます。の代わりにtemplate <typename T>、 があるかもしれませんtemplate <typename Container>

于 2013-02-12T17:50:20.213 に答える