5

ランタイムに基づいて特定のデバイスを返すクラスがあります。

struct ComponentDc;
struct ComponentIc;

typedef Device<ComponentDc> DevComponentDc;
typedef Device<ComponentIc> DevComponentIc;

template<class Component>
class Device{
 Device<Component>* getDevice() { return this; }
 void exec() { }
};

では、コンポーネント タイプが の場合は「Hello」、 の場合はworldexec()を出力したいと思います。また、デバイスを作成できるのはこれらの 2 つのタイプだけです。ComponentDcComponentIc

これを行うにはどうすればよいですか?

4

4 に答える 4

4

2 つの古典的な可能性があります。

まず、2 つのグローバル関数オーバーロードを使用します。1 つは 用ComponentDc、もう 1 つは 用ですComponentIc

void globalExec(ComponentDc) { std::cout << "Hello"; }
void globalExec(ComponentIc) { std::cout << "World"; }

void Device<Component>::exec() { globalExec(Component); }

2 番目に、 traits-class を使用します。フィールドを持たず、異なる typedef を持ち、メソッドとして静的関数のみを持つ純粋なテンプレート クラスです。このクラスには、さまざまな可能な引数の型に対する独自の特殊化があります。

template<Component> class DeviceTraits {};

template<> class DeviceTraits<ComponentDc> { 
    static std::string getMessage() { return "Hello"; }
};

template<> class DeviceTraits<ComponentIc> { 
    static std::string getMessage() { return "World"; }
};

void Device<Component>::exec() { 
    std::cout << DeviceTraits<Component>::getMessage(); 
}

特性クラスを使用する利点は、グローバル名前空間をいくつかの関数で台無しにする必要がないことです。

クラス自体の部分的な特殊化についてDevice- 常に可能であるとは限らず、テンプレート引数固有のコードを traits クラスに移動する方が便利であると考えられます。

これは、STL で使用される古典的なアプローチです。あるいは、boost::enable_ifまたはstd::enable_if(最新のコンパイラの場合) を使用できます。

于 2013-03-19T08:29:55.107 に答える
3

テンプレートを明示的にインスタンス化できます:

template<> class Device<ComponentDc> {
    ...
    void exec() { cout << "Hello"; }
};

についても同様ですDevice<ComponentIc>

また、テンプレート パラメーターを特定のセットに制限したい場合は、テンプレートの代わりに継承または構成を考える必要があります。

于 2013-03-19T08:29:17.707 に答える
1

boost::enable_if を使用することもできます

http://www.boost.org/doc/libs/1_53_0/libs/utility/enable_if.html http://www.boost.org/doc/libs/1_44_0/libs/type_traits/doc/html/boost_typetraits/reference /is_same.html

void Device<Component>::exec(boost::enable_if< boost::is_same<Component,ComponentDc> >* enabler = 0)
{
}

void Device<Component>::exec(boost::enable_if< boost::is_same<Component,ComponentIc> >* enabler = 0)
{
}
于 2013-03-19T08:37:04.630 に答える
0

インスタンス テンプレートの特殊化に使用: http://www.cprogramming.com/tutorial/template_specialization.html

ここでは、特定のメソッドに使用します: テンプレート化されたクラスからの単一メソッドのテンプレート特殊化

于 2013-03-19T08:28:10.447 に答える