template <typename X, typename Y> class A {
// Use Y::Q, a useful property, not used for specialization.
};
enum Property {P1,P2};
template <Property P> class B {};
class C {};
の通常のテンプレートになるが、特殊化になるA
ような部分的な特殊化を定義する方法はありますか?A<C, B<P1> >
A
A<C, B<P2> >
Marcelo に応じて編集: より具体的には、特殊化は B だけでなく、特定のプロパティを示す任意の型で選択する必要があります。たとえば、最初の引数が P2 であるテンプレートです。
目標は、 を使用して のようなものを記述できるようにするY
ための優れたインターフェイスを提供することです。A
A<C, Y<P2,Q> >
テンプレート パラメータをテンプレート テンプレート パラメータに置き換えるのはY
いいことですが、それに基づいて部分的に特殊化する方法はありP
ますか?
意図は次のようなものを書くことです:
template <typename X, template <Property P> typename Y> class A {};
template <typename X> class A<X,template<> Y<P2> > {}; // <-- not valid
In silico に応じて編集: テンプレート テンプレート パラメーターを作成するのはいいことだと言いましたが、実際には、論理的にリンクされたプロパティをグループ化するために使用することですが、1 つに基づいて専門Y
化するという、私がやりたかったことの目的を無効にします。それらのサブプロパティの。Y
A
特殊化に特性を追加してからtemplate <> class B<P2>
SFINAE を使用する方法はありA
ますか? 意図は次のようなものを書くことです:
template <> class B<P2> {
typedef int IAmP2;
};
// The following is not valid because it's a simple redefinition.
template <typename X, typename Y> class A {
// Substitution using this template would fail for Y<P1>, and only the
// general template would be left for selection.
typename Y::IAmP2 skipIfNotP2;
};