Специализируясь только на вложенном шаблоне
У меня есть следующий шаблон:
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;
};
(Да, мне также нужно, чтобы второй параметр был внутренним классом первого.)
1 ответ
№ §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> {
};
};