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