Заниманительная частичная специализация шаблонов

Занимаясь одним из своих проектов, случайно для себя обнаружил, что частично специализировать вложенные шаблонные классы можно параметрами шаблонов, в которые они вложены.

Например у нас есть шаблонный класс 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);
comments powered by Disqus