Эквивалент использования псевдонимов для шаблона

C ++ 11 добавил шаблоны псевдонимов, такие как:

 template<typename T> using identity = T;
 template<bool b, typename T = void> using EnableIf = typename std::enable_if<b, T>::type;

Это намного проще в использовании, чем старыйtemplate введите карты, которые дают вам возвращаемое значение в::type поле, потому что даже если ваши аргументы типа зависят от локального контекста, вам не нужно сообщать компилятору, что результатом является тип.

По сути, вы поднимаетеtypename от места использования доusing псевдоним.

Есть ли что-нибудь эквивалентное, что может быть использовано для избавления от произведенного постороннегоtemplates?

Предположим, у вас есть метафункция, результатом которой был тип или шаблон псевдонима вместо типа. Текущий метод выглядит примерно так:

template<typename T>
struct my_meta {
  template<typename U>
  using Template = identity<U>;
};

template<typename T>
struct my_meta {
  template<typename U>
  using Template = int;
};

который мы можем затем использовать следующим образом:

template<typename T, typename U>
typename my_meta<T>::template Template<U>
do_stuff( U&& ) { return {}; }

Это лишнееtemplate Ключевое слово в возвращаемом типе существует для устранения неоднозначности возвращаемого значения моей мета-функции - это то, что я хочу исключить.

Есть ли способ указать компилятору, что результатом мета-вычисления является другой псевдоним или шаблон класса в C ++ 11 или C ++ 1y, без использованияtemplate Ключевое слово в месте вызова?

То есть:

template<typename T, typename U>
my_meta_template<T><U>
do_stuff( U&& ) { return {}; }

или даже

template<template<typename> class Template>
void do_more_stuff() {}

template<typename T>
void do_stuff() {
  // syntax I want: just produce an alias or class template directly:
  do_more_stuff< my_meta_template<T> >();
  // vs what I find is required: the disambiguator:
  do_more_stuff< my_meta<T>::template Template >();
};

Ответы на вопрос(1)

Ваш ответ на вопрос