2011-12-20 1 views
3

Existe-t-il un moyen de stocker un modèle ou une variable automatique dans une classe sans faire de la classe un modèle? J'essaye de stocker un pointeur vers l'un des générateurs de nombres aléatoires de STL mais je n'arrive pas à trouver un moyen de le faire sans faire de la classe entière un modèle. Ce n'est pas une option car le déplacement de tous les éléments dans le fichier cpp vers h entraînerait une tonne de fichier d'en-tête cyclique dont je ne veux pas traiter. Ainsi, par exemple, il serait quelque chose comme ceci:Variable membre C++ de tout type dans la classe non-template

class tSomeClass 
{ 
    public: 
     template<typename RNG> 
     tSomeClass(RNG * rng) : fRNG(rng) { } 

    private: 
     RNG * fRNG; // How do I get this working??? 
}; 

tout Jusqu'à présent, je suis venu avec finit toujours avec avoir besoin de toute la classe comme un modèle, donc je suis perplexe.

EDIT: Je savais que j'avais oublié de mentionner quelque chose. Je ne peux pas utiliser l'héritage pour spécifier le type RNG puisque je n'ai aucune idée de la base, à moins que quelqu'un ne sache quelle est la classe de base pour les RNG utilisés par STL. Actuellement, j'utilise std :: default_random_engine.

+0

Pourquoi avez-vous besoin d'un modèle pour cela? L'héritage régulier ne fonctionnerait-il pas? – dasblinkenlight

+0

¤ Vous pouvez simplement stocker une fonction 'std :: < double() >'. Cheers & hth., –

+0

Êtes-vous sûr de ce que vous voulez stocker * TOUT * type * dans RNG? ne peux-tu pas le limiter d'une façon ou d'une autre? Je veux dire, voulez-vous stocker un pointeur sur une classe, un pointeur vers un type primitif et ainsi de suite? – Lucian

Répondre

5

je peux penser à deux options si vous ne voulez vraiment pas de modèles:

  • Si vous voulez dire littéralement tout type, vous pouvez utiliser void *. Ce n'est pas très sûr de type, et les utilisateurs de la classe devraient savoir exactement de quel type il s'agit réellement.
  • Si vous pouvez limiter le type à une interface/classe de base, vous pouvez utiliser un pointeur vers ce type à la place, par ex. IRandom *. Cela semble beaucoup plus utile/utilisable en général.
0

La méthode sûre et correcte consiste à définir une classe décrivant l'interface et à en hériter sur les implémentations réelles.

Exemple:

class RNG { 
    public: 
     virtual int get(void) = 0; 
} 
0

La voie C est d'utiliser un pointeur général (void*), mais puisque c'est C++ juste profiter de l'héritage et la liaison dynamique, à savoir:

class RNG /* random number generator interface/base class */ 
{ 
    public: 
     virtual int randomize(void) = 0; 
}; 

class RandomA : public RNG /* one implementation of a random num generator */ 
{ 
    public: 
     int randomize() { return 4; } 
}; 

class RandomB : public RNG /* another implementation of a random num generator */ 
{ 
    public: 
     int randomize() { return 0; } 
}; 

class tSomeClass 
{ 
    public: 
     tSomeClass(RNG * rng) : fRNG(rng) { } 

    private: 
     RNG * fRNG; 
}; 

... 

RandomA randomObj; 
tSomeClass t(&randomObj); 

Ou même un pointeur de fonction fera l'affaire si tous vos générateurs de nombres aléatoires sont constitués.

+0

Cela fonctionnerait si je connaissais la classe de base de tous les RNG, mais actuellement je ne le fais pas. Mise à jour de la question avec des détails. – Shenjoku

Questions connexes