3

Ist es möglich, zwei Vorlagenklassen in eine Vorlagenklasse zu übergeben?Mehrere Vorlagenvorlagenparameter für Vorlagenklasse

Ich bin auf der Suche nach einer Klasse, die zwei verschiedene std::tuple<std::vector<>> enthält.

Ich fange an zu vermuten, dass das, was ich erreichen möchte, nicht getan werden kann, aber ich kann nichts finden, was anders sagt.

Im Folgenden wird der Code Ich arbeite mit:

#include <iostream> 
#include <vector> 
#include <tuple> 

template<typename... Ts> 
struct Typelist 
{ 
    static constexpr std::size_t size { sizeof...(Ts) }; 
}; 

template<class, class> class World; 

template<template<typename... Arg1> class T1, template<typename... Arg2> class T2> 
class World<Typelist, Typelist> 
{ 

private: 
    std::tuple<std::vector<T1>...> m1; 
    std::tuple<std::vector<T2>...> m2; 
}; 


int main() { 
    // your code goes here 
    using TL1 = Typelist<int, char, double>; 
    using TL2 = Typelist<float, unsigned int, bool>; 

    World<TL1, TL2> w2; 
    return 0; 
} 

Live Example

Ist das möglich ist, und wenn ja, was mache ich falsch? Wenn nicht, gibt es eine mögliche Alternative?

+1

Die Verwendung von 'World ' ist nicht korrekt, da 'Typelist' keine Klasse ist. Sie können 'World , Typelist >' verwenden, aber es ist nicht klar aus Ihrem Post, was sinnvolle Werte für 'args1' und' args2' wären. –

+0

Bitte erklären Sie mir, was der Zweck des Tupels ist, ist es mir überhaupt nicht klar, weil wie geschrieben nur ein Typ darin ist, und Sie den '...' Operator missbrauchen? Es gibt kein Parameterpaket zum Erweitern? Versuchen Sie, 'std :: tuple ...>' zu tun? – OmnipotentEntity

Antwort

2

Dies ist, was ich denke, Sie könnten meinen.

#include <iostream> 
#include <vector> 
#include <tuple> 

template<typename... Ts> 
struct Typelist 
{ 
    static constexpr std::size_t size { sizeof...(Ts) }; 
}; 

template <class, class> 
class World; 

template <typename... Arg1, typename... Arg2> 
class World<Typelist<Arg1...>, Typelist<Arg2...>> 
{ 

    private: 
    std::tuple<std::vector<Arg1>...> m1; 
    std::tuple<std::vector<Arg2>...> m2; 
}; 


int main() { 
    using TL1 = Typelist<int, char, double>; 
    using TL2 = Typelist<float, unsigned int, bool>; 

    World<TL1, TL2> w2; 
    return 0; 
} 

Die Änderungen vorgenommen:

Zunächst wurde die Template-Spezialisierung auf zwei nackte Parametern Pack geändert, das ist machbar, weil das Parameter-Pack durch das Template-Matching-Engine, basierend auf den Typen mit den Typelist gefüllt ist , also ist es eindeutig. Sie können die zuvor verwendete Spezifikation nicht verwenden, da Sie dann nur auf T1 und T2 zugreifen können. Sie haben keinen Zugriff auf die Namen der Argumente des inneren Parameterpakets.

Zweitens, ich geändert, wie die Datenelemente von World definiert wurden, so dass m1 und m2 Tupeln von Vektoren von Typen sind.

Drittens können Sie Typelist vollständig loswerden und eine tuple direkt verwenden. Es sei denn, es macht etwas, das nicht in diesem Code enthalten ist.

#include <iostream> 
#include <vector> 
#include <tuple> 

template <class, class> 
class World; 

template <typename... Arg1, typename... Arg2> 
class World<std::tuple<Arg1...>, std::tuple<Arg2...>> 
{ 

    private: 
    std::tuple<std::vector<Arg1>...> m1; 
    std::tuple<std::vector<Arg2>...> m2; 
}; 


int main() { 
    using TL1 = std::tuple<int, char, double>; 
    using TL2 = std::tuple<float, unsigned int, bool>; 

    World<TL1, TL2> w2; 
    return 0; 
} 
Verwandte Themen