У меня есть следующий шаблон:
template<typename FirstParam>
struct First
{
template<typename SecondParam>
struct Second;
};
Пример специализации:
template<typename T> class D {};
template<>
template<>
struct First<C1>::Second<C1::C2>
{
typedef D<C1::C2> type;
};
Это тот случай, когда оба класса специализируются одновременно. Но можно ли специализировать только второй класс?
Что-то вроде:
template<typename OuterParam>
template<>
struct Outer<OuterParam>::Inner<typename OuterParam::C2>
{
typedef E<typename OuterParam::C2> type;
};
(Да, мне также нужно, чтобы второй параметр был внутренним классом первого.)
№ §14.7.3 [temp.expl.spec] / p16, выделение добавлено:
В явном объявлении специализации для члена класса
шаблон или шаблон члена, который появляется в области пространства имен,
шаблон члена и некоторые из его шаблонов классов могут остаться
неспециализированными, за исключением того, что декларация не должна явно
специализировать шаблон члена класса, если он включает в себя шаблоны классов
не являются явно специализированными.
Вы можете использовать «частичную» специализацию и std::is_same
вместо:
template<typename FirstParam>
struct First
{
template<typename SecondParam, bool = std::is_same<typename FirstParam::C2,
SecondParam>::value>
struct Second;
template<class T>
struct Second<T, true> {
};
};