8

テンプレート化されたクラスがあります

template <typename Data>
class C
{
.....
}

ほとんどの場合、データの型を置換できるようにコンパイラに依存しています。データ型のオブジェクトでメソッド foo()、goo() を呼び出すので、代用するものはそれを提供する必要があります。

ここで、データ型を int と string に置き換える必要があります。クラスがすでに大きすぎて、各メソッドを特殊化する必要があるため (コードを少し変更するだけで)、特殊化したくありません。

私のオプション(他にあれば教えてください)

1) メソッド foo()、goo() などを実装する int および string のラッパー クラスを提供できます。

2) foo()、goo() を提供するクラスのオブジェクト (これらは私の現在の置換可能なクラスです) で foo() または goo() を呼び出す特性クラスの特性を提供し、これらのクラスを int および string に特化します。

質問

1) 1 対 2 の相対的なメリットは何ですか?

2) 私の特性クラスには静的メソッドがあります。特性クラスに非静的メソッドを含めることはできますか? ほとんどの特性クラスは STL で定数を定義しています。

3) 特性クラスをグローバルにしますか、それともクラス C のテンプレート パラメーターとして渡す必要がありますか?

4

3 に答える 3

7

次のようにクラスの一部を特殊化できます。

template <typename Data>
class C
{
  void foo();

  // lot of other stuff
};

// specialize part of class C 
// (some members of a class C will have specific 
//  implementation for specific types)
template<> void C<int>::foo() { std::cout << "int" << std::endl; }
template<> void C<std::string>::foo() { std::cout << "string" << std::endl; }
// same for goo

上記の構文は、C++ 標準 14.7/3 および 14.5.2/2 で許可されています。クラスのすべてのものをC数回書き直す必要はありません。

このような方法でテンプレート クラスを部分的に特殊化することは許可されていないことに注意してください。たとえば、この方法ではDataData*の型に異なる関数を定義することはできません。

于 2010-06-10T20:22:05.343 に答える
2

1) 1 対 2 の相対的なメリットは何ですか?

ビルトインのラッパーはCシンプルに保ちます。トレイトは組み込みの組み込みを保持します。:)
によって異なるコードをData基本クラスのテンプレートに分解して、それを特殊化することもできます。

2) 私の特性クラスには静的メソッドがあります。特性クラスに非静的メソッドを含めることはできますか? ほとんどの特性クラスは STL で定数を定義しています。

状態がある場合、それがまだ「特性」と呼ばれているかどうかさえわかりません。
FWIW、私は通常、他のタイプに関する情報を除外するもののみを特性として分類します。行動に関して言えば、私はむしろそれをポリシーと呼んでいます。しかし、それstd::char_traitsはこれらの定義に当てはまらないことがわかります。:( とにかく、それが非静的メンバーを持っている場合、それには状態があり、私はもうこれを特性とは呼びません。

3) 特性クラスをグローバルにしますか、それともクラス C のテンプレート パラメーターとして渡す必要がありますか?

これをテンプレート パラメーターとして渡すことは、 のユーザーが として渡したものにC独自の特性を提供することを望んでいるという意味にすぎませんDataintクラスの特性テンプレートが常に 1 つある場合は、それを使用できます。ユーザーが の独自の特性を考え出す場合int、それを に渡す方法が必要Cです。

于 2010-06-10T20:16:02.707 に答える
0

それぞれ半ダース?一般的な意味で一方と他方を使用するアプリオリな理由はわかりません。あなたが尋ねていることのどれも、あなたが他のものよりも1つを選ぶべきだと私に思わせるものではありません. 私が考えることができる唯一のことは、選択肢1はおそらく既存の機能への変更が少なくて済むということです。一方、クライアントは、ラッパーを作成せずにプリミティブで関数を使用することはできません。

それは本当に詳細の問題であり、あなたはそれらを提供しませんでした。

于 2010-06-10T20:18:30.657 に答える