5

このクラステンプレートを検討してください。

template <typename T1, typename T2, bool B>
class SomeClass { };

ここで、とに基づいた2つの実装を提供したいと思いB==trueますB==false。つまり、私は次のようなことを言いたいのです。

template <ANYTHING, ANYTHING, true> class SomeClass {
// First implementation
};

template <ANYTHING, ANYTHING, false> class SomeClass {
// Second implementation
};

これはC++(11)でどのように行うことができますか?

4

2 に答える 2

8

部分的な特殊化:

// primary
template<typename X, typename Bool>
struct Foo;

template<typename X>
struct Foo<X, std::true_type> {};

template<typename X>
struct Foo<X, std::false_type> {};

// use
Foo<X, std::true_type> x;

には型ラッパーを使用しますが、型bool以外のテンプレートパラメーターを使用してこれを行うこともできます。

// primary
template<typename, bool>
struct Foo;

template<typename X>
struct Foo<X, true> {};

template<typename X>
struct Foo<X, false> {};

// use
Foo<X, true> x;

デフォルトの引数でメタプログラミングを使用して、部分的な特殊化に使用される値を計算できる場合があります。

// primary
template<typename X, typename is_integral_ = std::is_integral<X>::type>
struct Foo;

これにより、ユーザーの選択によって構成変数をオーバーライドできるようになります。

struct my {};
Foo<my, std::true_type> x;

これを防ぐには、継承を介してディスパッチします。

// primary, where Foo_impl is any of the above
template<typename X>
struct Foo : public Foo_impl<X> {};
于 2012-11-22T14:59:03.363 に答える
4

これは部分特殊化と呼ばれます:

template <typename T1, typename T2> class SomeClass<T1 ,T2, true> {
// First implementation
};

template <typename T1, typename T2> class SomeClass<T1, T2, false> {
// Second implementation
};

名前が示すように、これは次のような(完全な)特殊化に関連しています。

template <> class SomeClass<int, char, false> {
// dedicated version for T1=int, T2=char, B=false
};

ほとんどの実装が同じである場合は、単一の汎用バージョンを作成することもできます。この場合、bool引数に依存するコードのみがトレイトクラスに委任されます。この場合、トレイトクラスは単一の引数に完全に特化されます。

于 2012-11-22T14:59:44.433 に答える