Tout le type de C++ de la classe de modèle dans la variable membre
J'ai deux classes.
La première classe (Un) est construit avec un modèle.
template <class T>
class A
{
public:
T value;
};
La deuxième classe (B) doit avoir un objet de la classe A comme variable membre. Comme ceci:
class B
{
public:
A<int> value;
};
Mais maintenant je veux utiliser tout sorte de modèle, de classe en classe A. Non seulement int.
Évident que je ne peux pas déclarer un (un membre)de la variable qui contient toute sorte d'une classe.
Donc, j'ai besoin de quelque chose comme ceci:
class B
{
public:
A<*> value;
};
Est-il (propre) de solution pour ce problème?
-- Salutation de l'Allemagne, Bastian
Pourquoi avez-vous besoin d'une telle chose? Décrivez le but, non pas de l'étape.
OriginalL'auteur user906756 | 2011-08-22
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir une seule classe
B
avec "tout" membre de l'objet, carB
doit être une classe bien définie, etA<T>
est un différents type de pour les différents typesT
. Vous pouvez soit faireB
un modèle lui-même:ou vous pouvez prendre un coup d'oeil à
boost::any
, qui est le type d'effacement des données de conteneur pour les types arbitraires (mais en faisant usage de celui-ci exige une certaine quantité de travail supplémentaire). Leany
classe fonctionne uniquement pour les valeur types, cependant, il n'est pas complètement arbitraire.any_cast
travail sans type?dans le sens que le type de la
any
objet ne dépend pas du type de choses que vous mettez dans. Comparer àshared_ptr<T>
, qui peut être construit avec un custom deleter ou allocateur personnalisé, ni de qui font partie de ce type.Un conte pour un type d'effacement des données de la classe est un organisme privé imbriquée polymorphes classe à partir de laquelle basées sur des modèles de sous-classes sont dérivées. Jetez un oeil à
any.hpp
, c'est ce qu'il se passe (appeléplaceholder
).href="http://stackoverflow.com/questions/6122094/building-boostoptions-from-a-string-boostany-map/6123962#6123962">Voir cette réponse.
OriginalL'auteur Kerrek SB
La solution la plus simple serait de faire toutes Une des variantes ineherit partir d'une interface commune, même si elle est vide :
Maintenant, les coûts associés:
Avantage :
Donc, pour faire mieux il y a d'autres moins des solutions simples, mais qui sont assez simple à utiliser :
Si vous pouvez utiliser boost, boost::any, boost::variant et boost::mpl pourrait être la base de solutions.
Boost tout peut être utilisé comme un remplacement en toute sécurité à vide*. Le seul problème avec cela est que vous pouvez avoir n'IMPORTE quel type, comme si le type est un paramètre du modèle de la classe B.
Boost variante peut être utilisée avec succès si vous connaissez tous les types que peut être.
MPL peut être utile si vous voulez juste pour définir une liste de types et assurez-vous que vos membres s'appliquent uniquement à eux. Vous pouvez faire une tonne de choses avec MPL donc, cela dépend vraiment de vos besoins.
OriginalL'auteur Klaim
Vous avez deux choix, je pense. La première est de paramétrer votre classe sur le type des paramètres des variables d'instance:
L'autre option est de déclarer
value
comme unvoid*
pointeur. (Mais ce n'est probablement pas ce que vous voulez).OriginalL'auteur Jonathan Sterling
oui, ça a déjà été fait. boost::any.
OriginalL'auteur Nim
Je pense que ça aide à comprendre, que basées sur des modèles de classes de créer un tout nouveau et distinct de la classe pour chaque type que vous utilisez. Par exemple,
Vector<int>
etVector<float>
sont aussi distinctes que les classesVectorInt
etVectorFloat
.Pour la classe B, vous êtes essentiellement en demandant à ce que la
value
variable soitA<int>
ouA<float>
, qui est la même chose que de dire que vous voulez de la valeur à être un "A_int" ou "A_float". Et de réaliser que vous... eh bien, utilisez un autre modèle!OriginalL'auteur Anne Quinn