部分的な特殊化:
// 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> {};