Entspricht dem Verwenden von Aliasen für Vorlagen

C ++ 11 fügte Alias-Vorlagen hinzu, wie zum Beispiel:

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

Diese sind viel einfacher zu bedienen als die altentemplate Geben Sie Maps ein, die den Rückgabewert in a angeben::type Auch wenn Ihre Typargumente vom lokalen Kontext abhängig sind, müssen Sie den Compiler nicht darüber informieren, dass das Ergebnis ein Typ ist.

In der Tat heben Sie dietypename vom Einsatzort zumusing alias.

Gibt es etwas Äquivalentes, das verwendet werden kann, um produziertes Fremdes loszuwerden?templates?

Angenommen, Sie hatten eine Metafunktion, deren Ausgabe eine Klassen- oder Aliasvorlage anstelle eines Typs war. Die aktuelle Methode sieht ungefähr so ​​aus:

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

was wir dann so verwenden können:

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

Das extratemplate Das Schlüsselwort im Rückgabetyp ist vorhanden, um den Rückgabewert meiner Meta-Funktion zu disambiguieren, den ich eliminieren möchte.

Gibt es eine Möglichkeit, dem Compiler anzuzeigen, dass das Ergebnis einer Metacomputation ein anderer Alias ​​oder eine andere Klassenvorlage in C ++ 11 oder C ++ 1y ist, ohne das zu verwenden?template Stichwort am Ort des Aufrufs?

Dh:

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

oder auch

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage