Подтвердить что ты не робот

Возможно ли создать псевдоним шаблона?

Рассмотрим следующий код:

template< template< typename ... > class ... Ts >
struct unite
{
    template< typename ... T >
    struct type
        : Ts< T ... > ...
    { };
};

// This does not work as ::type does not name a type, but a template:

// template< template< typename ... > class ... Ts >
// using unite_t = typename unite< Ts ... >::type;

template< typename > struct debug_none {};
template< typename > struct debug_cout {};

template< typename ... > struct raise_demangled {};
template< typename ... > struct raise_specialized {};

template< typename, typename = int > struct match_default {};

template< template< typename ... > class Control >
void f()
{}

int main()
{
    f< unite< debug_none, raise_demangled, match_default >::type >();

    // Is there any way to create something like unite_t which works like this:

    // f< unite_t< debug_none, raise_demangled, match_default > >();
}

Живой пример

Вопрос: Есть ли способ создать какой-то "псевдоним шаблона", аналогичный псевдониму типа? (см. unite_t в приведенном выше примере)

4b9b3361

Ответ 1

Нет, вы не можете.

using может "возвращать" тип или переменную. Он не может "вернуть" template. Подобных механизмов не существует.

Вы можете сделать что-то смутно полезное, приняв соглашение о том, что все шаблоны не являются шаблонами, а скорее классами с алиасом template<?>using apply=?; внутри них (и пока мы находимся в нем, константы std::integral_constants<T,?>, а указатели pointer_constant<T*,?>).

Теперь все это класс. template становятся просто видами классов (с ::apply<?...>.

Применение набора типов к такому шаблону будет осуществляться с помощью:

template<class Z, class...Ts>
using apply_t = Z::template apply<Ts...>;

Итак, с "родным" шаблоном Z вы бы сделали Z<Ts...>. С помощью этих "косвенных" шаблонов вы бы сделали apply_t<Z, Ts...>.

С помощью этого соглашения шаблон using может возвращать непрямой шаблон. Если остальная часть вашего кода соответствует соглашению всегда вызывать apply_t для применения шаблона, и вы косвенным образом меняете все остальные шаблоны, которые вы пишете, мы закончили.

Это некрасиво.