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> >
была бы специализацией?
Редактировать в ответ на Марсело : Точнее, специализация должна быть выбрана не только с 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 : Я сказал, что было бы неплохо сделать 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;
};