Все мы любим частично специализировать шаблоны.
Вот примерно так:
template <class>
struct Flip;
template <class A, class B>
struct Flip <std::pair<A, B>>
{};
template <class A>
struct Flip <std::array<A, 2>>
{};
Неудобно, что перед тем как использовать новое имя в аргументах, его нужно сначала объявить в параметрах шаблона.
Из-за этого код бывает многословным:
template <class T, T A, class B>
struct Cons;
template <class T, template<T...>class Arr, T Head, T...Tail>
struct Сons <T, Head, Arr<Tail...>>
{};
Что, если сделать специальный синтаксический сахар (с транслятором в стандартные кресты) для того, чтобы можно было делать объявления прямо внутри аргументов?
template <>
struct Flip <std::pair<class A, class B>>
{};
template <>
struct Flip <std::array<class A, 2>>
{};
template <template<class T...>class Arr>
struct cons <T Head, Arr<T...Tail>>
{};
template <>
без параметров можно опустить.
Вместо template<class T...>class Arr
в объявлении можно писать class Arr<T...>
.
И заменить ключевое слово class
на @
.
struct Flip <std::pair<@A, @B>>
{};
struct Flip <std::array<@A, 2>>
{};
template <@Arr<@T...>>
struct cons <T Head, Arr<T...Tail>>
{};
Да, не стоит забывать, что объявленное можно использовать более одного раза. Следующие строки эквивалентны:
template <class A> struct Eq <A, A> {};
struct Eq <@A, @A> {};
struct Eq <@A, A> {};
С таким сахаром писать на крестах будет немного проще.