3

Est-il possible de passer deux classes de gabarit dans une classe de gabarit? Je cherche à créer une classe qui détient deux std::tuple<std::vector<>> différents. Je commence à soupçonner que ce que je veux accomplir ne peut pas être fait, mais je ne trouve rien qui dise le contraire.Paremètres de modèles de gabarits multiples pour la classe de gabarit

Voici le code, je travaille avec:

#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

Est-ce possible, et si oui, qu'est-ce que je fais mal? Sinon, existe-t-il une alternative possible?

+1

L'utilisation de 'World ' n'est pas correcte car 'Typelist' n'est pas une classe. Vous pouvez utiliser 'World , Typelist >' mais il n'est pas clair à partir de votre message quelles seraient les valeurs sensibles pour 'args1' et' args2'. –

+0

S'il vous plaît expliquez-moi quel est le but du tuple, ce n'est pas clair pour moi, car comme écrit il ya un seul type à l'intérieur, et vous abusez de l'opérateur '...'? Il n'y a pas de pack de paramètres à développer? Est-ce que vous essayez de faire 'std :: tuple ...>'? – OmnipotentEntity

Répondre

2

C'est ce que je pense que vous pourriez vouloir dire.

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

Les modifications apportées:

En premier lieu, la spécialisation du modèle a été modifié à deux paquets de paramètres nus, ce qui est faisable, car les paquets de paramètres sont remplis par le moteur correspondant de modèle basé sur les types avec le Typelist , donc c'est sans ambiguïté. Vous ne pouvez pas utiliser la spécification que vous avez utilisée précédemment parce que vous n'avez accès qu'à T1 et T2, vous n'avez pas accès aux noms des arguments du pack de paramètres interne.

Deuxièmement, j'ai changé comment les membres de données de World ont été définis, de sorte que m1 et m2 sont des tuples de vecteurs de types. Troisièmement, vous pouvez vous débarrasser entièrement de Typelist et utiliser directement un tuple. À moins qu'il ne fasse quelque chose qui ne figure pas dans ce code.

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