Специализируясь только на вложенном шаблоне

У меня есть следующий шаблон:

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;
};

(Да, мне также нужно, чтобы второй параметр был внутренним классом первого.)

3

Решение

№ §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> {
};
};
4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector