Odpowiednik aliasów `using` dla` szablonu`

C ++ 11 dodał szablony aliasów, takie jak:

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

Są znacznie łatwiejsze w użyciu niż staretemplate wpisz mapy, które dają wartość zwracaną w a::type pole, ponieważ nawet jeśli argumenty typu zależą od kontekstu lokalnego, nie musisz informować kompilatora, że ​​wynik jest typem.

W efekcie podnosisztypename z miejsca użytkowania dousing Alias.

Czy jest coś równoważnego, którego można użyć, aby pozbyć się wyprodukowanych obcychtemplates?

Załóżmy, że masz metapunkty, których wyjściem był szablon klasy lub aliasu zamiast typu. Obecna metoda to coś takiego:

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;
};

które możemy następnie wykorzystać w ten sposób:

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

To dodatkowetemplate słowo kluczowe w typie powrotu istnieje w celu ujednoznacznienia wartości zwracanej przez moją funkcję meta jest tym, co chcę wyeliminować.

Czy istnieje sposób wskazania kompilatorowi, że wynikiem metakomputacji jest inny alias lub szablon klasy w C ++ 11 lub C ++ 1y, bez użyciatemplate słowo kluczowe w miejscu wywołania?

To znaczy:

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

lub nawet

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 >();
};

questionAnswers(1)

yourAnswerToTheQuestion