0

テンプレート プログラミングで型特性または動作を定義するには、2 つの方法があります。

1つはクラス内で定義することです

class MyClass
{
public:
    typedef ... DialogType;
    static string type() {...}
    ...
};

もう1つはクラス外で定義されています

class MyClass {...};

template<class T> struct Dialog;
template<> struct Dialog<MyClass> { typedef ... Type;}


template<class T> string type();
template<> string type<MyClass>() { ... }

どちらの方法が優れているのか、その理由 > または、他に良い方法はありますか?

4

1 に答える 1

1

「通常の」テンプレート プログラミングでは、ドメインの抽象化を定義するために必要なものをすべて組み合わせるのが最善です。これは、通常のクラスで使用する設計原則 (SOLID など) を使用して行うのが最適です。ただし、テンプレート クラスの場合は、通常、テンプレートに依存しないコードを非テンプレート ベース クラスに含めようとします (コードの肥大化を避けるため)。

メタプログラミングの目的で、Boost.MPL ライブラリは 2 つの理由から、クラスごとに 1 つのネストされた型を排他的に使用します (それらは、トレイトごとに複数の型を「ブロブ」アンチパターンと呼ぶことさえあります)。

  1. 1 つのネストされた型にアクセスするたびに、クラスのインスタンス化によって他の未使用のネストされた型の多くの不要な解析が行われないため、より効率的です。
  2. 単一の「戻り値の型」を持つと、メタ関数を構成するのが簡単になります
于 2013-10-14T19:34:37.800 に答える