10
votes

Est-il possible de choisir un paramètre de type générique C ++ au moment de l'exécution?

Y a-t-il un moyen de choisir le type générique d'une classe au moment de l'exécution ou est-ce une chose de compilation en C ++?

Ce que je veux faire est quelque chose comme ceci (pseudocode): P>

Generictype type;
if(somveval==1)
    type = Integer;
if(someval==2)
    type = String;

list<type> myList;


1 commentaires

Tout est possible. Mais ce que vous essayez de faire n'est pas facile en C ++. Si vous expliquez pourquoi vous essayez de le faire, nous pouvons peut-être vous donner de meilleurs conseils.


5 Réponses :


12
votes

C'est un moment de compilation. Les types de paramètres de modèle doivent être connus du compilateur au moment de la compilation.

Cet étant, dit en utilisant certaines techniques de méta-programmation de modèles, vous pouvez choisir un type ou un autre au moment de la compilation, mais uniquement si tous les types possibles sont connus. Au moment de la compilation, et seulement si la condition de sélection d'un type peut être résolue au moment de la compilation. P>

Par exemple, en utilisant une spécialisation partielle, vous pouvez sélectionner un type à la compilation en fonction d'un entier: P >

template <typename T>
class Foo
{ };

template <int N>
struct select_type;

template<>
struct select_type<1>
{
    typedef int type;
};

template<>
struct select_type<2>
{
    typedef float type;
};

int main()
{
    Foo<select_type<1>::type> f1; // will give you Foo<int>
    Foo<select_type<2>::type> f2; // will give you Foo<float>
}


0 commentaires

0
votes

Je ne peux pas penser à une situation où cela serait utile, mais ... xxx


0 commentaires

2
votes

Comme d'autres personnes ont également répondu, la réponse à votre question est "Non", C ++ ne prend pas en charge la frappe dynamique au moment de l'exécution. Je voulais juste souligner que, selon ce que vous essayez d'accomplir, vous pourrez peut-être simuler cette saisie dynamique à l'aide d'un syndicat , ce qui est comment le Type de variante est implémenté dans COM.


0 commentaires

0
votes

Le plus proche que vous obtiendrez est:

template <typename T>
void do_stuff_with_list
{
    list<T> myList;
    ...
}

enum Type
{
   Integer = 1,
   String
};

void do_stuff(Type type)
{
    switch (type)
    {
    case Integer:
        do_stuff_with_list<int>();
        break;
    case String:
        do_stuff_with_list<string>();
        break;
    };
}


0 commentaires

2
votes

Il est possible avec Boost.Variant (nombre fixe de différents types) ou Boost.La (un type pouvant stocker n'importe quel type, votre "pointeur vide", mais avec des informations de type).

Il est également possible si la chaîne et l'entier sont dérivés d'une classe de base polymorphe. (Mais pour cela, ils devraient mettre en œuvre la même interface, qui peut ou non être possible dans votre cas.)

Généralement, le polymorphisme est le moyen le plus simple de le faire, ce qui est bien utilisé tout le temps.

variante et tout prenant un peu de travail à utiliser: vous avez toujours besoin d'une manière ou d'une autre pour obtenir le contenu comme le type de bon type de stockage. (En quelque sorte comme si vous utilisiez des coulées en bas sur des classes dérivées, au lieu de s'appuyer sur des appels de méthode polymorphes.)


0 commentaires