2017-03-15 4 views
10

Alias ​​kann man eine verschachtelte Vorlage-Klasse mit einem using Schlüsselwort Aliasnamen? So etwas wie dieseWie eine verschachtelte Vorlage-Klasse mit Variadic-Parameter-Packs Aliasnamen

template <typename... Types> 
struct Something { 
    template <typename... TypesTwo> 
    struct Another {}; 
}; 

template <typename... Types> 
template <typename... TypesTwo> 
using Something_t = typename Something<Types...>::template Another<TypesTwo...>; 

int main() { 
    Something_t<int><double>{}; 
    return 0; 
} 

Diese Antwort template template alias to a nested template? zeigt einen Weg, das zu tun, aber das wird nicht mehr funktionieren, wenn beiden Parameter Pack variadische sind, wie der Compiler nicht, wo wissen zu beginnen und wo die Typenlisten zu beenden.

+0

Warum brauchst du so einen bestimmten Weg? Sie können Code leicht ändern und ähnlichen Code verwenden 'Something_t :: Something2 ' – LmTinyToon

+0

@LmTinyToon Es ist möglich, ohne es zu tun, aber ich frage mich nur, ob es eine Sache ist. – Curious

+3

@LmTinyToon Weil er neugierig ist ...: P – 101010

Antwort

2

nicht genau das, was Sie gefragt, aber ... wenn Sie Ihre variadische Typenlisten als Argumente von Tupeln (oder Klassen) wickeln können ...

#include <tuple> 

template <typename ... Types> 
struct Something 
{ 
    template <typename ... TypesTwo> 
    struct Another {}; 
}; 

template <typename, typename> 
struct variadicWrapper; 

template <typename ... Ts1, typename ... Ts2> 
struct variadicWrapper<std::tuple<Ts1...>, std::tuple<Ts2...>> 
{ using type = typename Something<Ts1...>::template Another<Ts2...>; }; 

template <typename T1, typename T2> 
using Something_t = typename variadicWrapper<T1, T2>::type; 

int main() 
{ 
    Something_t<std::tuple<int>, std::tuple<double>>{}; 
} 
0

keine eigenständige Antwort, sondern eine Ergänzung zu max66 Antwort:

Sie könnten versucht haben diese:

template<typename ... TT, typename ... TTT> 
using Alias = typename Something<TT...>::Another<TTT...>; 

Sieht auf den ersten wirklich nett, d oder nicht?

Problem wird einzelne Template-Parameter mit einer sein, aber schon damals:

Alias<int> a; 

Welches ist es jetzt? Something<int>::Another<> oder Something<>::Another<int>? Und wenn Sie mehr Parameter haben, wie verteilen? Keine Chance, eine sinnvolle Lösung zu finden. Also nein, das kannst du nicht direkt machen, du musst dir selbst mit Tricks wie max66 vorschlagen ...

+1

Ziemlich sicher OP weiß, das wird nicht funktionieren. Wie in der Frage ... – Barry

+0

Er versuchte mit schlechter Syntax (zwei Vorlagen Parameterlisten) - sicher * das * kann nicht funktionieren. Oben ist jetzt die richtige Syntax (im Vergleich zu max66's anwwer), kann aber aufgrund von Ambiguiten immer noch nicht funktionieren ... – Aconcagua

Verwandte Themen