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