Заниманительная частичная специализация шаблонов
Занимаясь одним из своих проектов, случайно для себя обнаружил, что частично специализировать вложенные шаблонные классы можно параметрами шаблонов, в которые они вложены.
Например у нас есть шаблонный класс nested
, вложенный в шаблонный класс str
:
template <typename X1, typename Y1>
struct str {
template <typename X2, typename Y2>
struct nested {
static constexpr bool is_spec = false;
};
};
Мы можем сделать частичную специализацию класса nested
, которая зависит от параметров шаблонного класса str
:
template <typename X1, typename Y1>
template <typename T>
struct str<X1, Y1>::nested<T, Y1> {
static constexpr bool is_spec = true;
};
Эта специализация применяется только тогда, когда параметр
Y2
шаблонного класса nested
имеет точно такой же тип, что и
параметр Y1
родительского шаблонного класса str
:
static_assert(!str<int, float>::nested<double, char>::is_spec);
static_assert(str<int, float>::nested<double, float>::is_spec);