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
«s нормальный шаблон, но 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
Редактировать в ответ на В силикомарганца: Я сказал, что было бы неплохо сделать 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;
};
Что вы пытаетесь сделать конкретно? Вероятно, вы можете достичь того, чего хотите, но я не совсем понимаю ваш вопрос. Что означают 'X' и' Y' в вашем предполагаемом приложении? –
Кстати, SFINAE работает только для функциональных перегрузок, а не для специализированных шаблонов. –
Предположим, у вас есть Matrix, и вы хотите сделать что-то вроде Matrix > или Matrix >, но вам нужна специализированная версия матрицы для всех плотных схем хранения. –
Kenzo