Je dois créer une porte-objet générique classe. Je suis venu avec quelque chose de simple commeClasse de porte-objet générique - C++
template<typename T>
class ObjectCarrier
{
public:
const T& item() const
{
return item_;
}
void setItem(T& item)
{
item_ = item;
}
private:
T item_;
};
Cela fonctionne bien quand T
a obtenu un constructeur par défaut (sans paramètre). Les choses se compliquent quand T
a des constructeurs paramétrés. Donc, je réécris la classe comme
template<typename T>
class ObjectCarrier
{
public:
const T& item() const
{
return *item_;
}
void setItem(T& item)
{
item_ = new T (item);
}
private:
T* item_;
};
changé la variable item_
à T*
et créé une nouvelle instance en utilisant le constructeur de copie de T
. Encore une fois cela a bien fonctionné jusqu'à ce que T
soit un type de pointeur. Je veux dire ObjectCarrier<Foo*>
ne fonctionnera pas.
Je me demande comment puis-je concevoir cette classe afin qu'elle fonctionne pour presque tous les types de types. Je pense que je devrais créer un type traits
spécialisé pour les pointeurs. Mais malheureusement, je ne suis pas capable de faire ce travail.
Toute aide serait géniale.
Pourquoi le premier fonctionne pas avec les constructeurs avec des paramètres? Vous n'avez sûrement besoin que d'un constructeur de copie? Ou ai-je oublié quelque chose? – Goz
@Goz: Il vous manque quelque chose. Lorsque l'objet est créé, la valeur par défaut (vide ou avec tous les paramètres par défaut) est utilisée pour construire le membre item_. – rmn