1

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

  template <typename T>
    class MyContainerClass

Tの代わりに使用する型については、get_id()、int data()などの多くの要件を満たす必要があります。

明らかに、基本的なタイプ(POD)のいずれも代替可能ではありません。これを提供できる1つの方法は、これらの関数を提供するPODのラッパーを使用することです。これは許容できる方法ですか?

別の方法は、テンプレートを次のように変更することです。

template < typename T, typename C=traits<T> >
class MyContainerClass

MyContainerClass内で、Tオブジェクトのdata()の代わりにtraits :: data()を呼び出します。専門にしますtraits<int>, traits<const char *>など。

これは良いデザインですか?このようなトレイトクラスを設計するにはどうすればよいですか(完全に静的なメソッドまたは継承を許可します)?または、ラッパークラスは良い解決策ですか?

他にどのような選択肢がありますか?

4

4 に答える 4

3

それを解決する別の方法は、テンプレートを特定のタイプに特化することです。

template <>
    class MyContainerClass<int>

そして、コンテナをintで使用するために必要なすべてを明らかに実装します。

しかし、traits-solution の方がはるかに優れていると思います。また、後で作成する他のコンテナーや他のクラスで特性を再利用することもできます。

于 2010-05-30T21:12:39.457 に答える
0

別の理由で、私も特性を好みます。sfinae を使用すると、機能する is_class 述語を取得できます。

template <typename T>
struct traits
{
    static const bool is_class = sizeof(test<T>(0)) == 1;

private:
    template <typename U> char (&test(int U::*))[1];
    template <typename> char (&test(...))[2];
};

すべての基本的な型を列挙する必要なく、非クラスの型に特化します (これには、保守可能にするためにいくつかのマクロが必要です...)

于 2010-06-23T09:59:32.560 に答える
0

std が type_traits を非常に広範囲に使用していることがわかります。それらが実際にニーズを満たしているかどうかを確認することもできますが、これはまた、特性構造体仕様が正しい方法であるという良いヒントになるはずです。

于 2010-05-30T21:22:16.630 に答える
0

他の誰もが専門化を好むように見えますが、私は特性を使用します. それには 2 つの理由があります。

  1. それらは特殊化も使用するため、「特殊化を使用する」という変装したアイデアですが、実際のアルゴリズムを汚染しないように、特殊化を外部化するという考えです。

  2. 標準ライブラリで使用されているため、誰もがすぐに認識できる、実績のあるよく知られた手法です。対照的に、特殊化は標準ライブラリではあまり使用されません。(誰かが叫んでいるのが聞こえましたかstd::vector<bool>?)。

于 2010-05-30T21:28:38.693 に答える