Héritage au lieu de typedef
-
22-07-2019 - |
Question
C ++ n'est pas en mesure de créer un modèle à partir d'un typedef ou typedef d'une classe basée sur des modèles. Je sais que si j'hérite et que ma classe est un modèle, cela fonctionnera.
Exemples:
// Illegal
template <class T>
typedef MyVectorType vector<T>;
//Valid, but advantageous?
template <class T>
class MyVectorType : public vector<T> { };
Est-ce que cela est avantageux pour que je puisse & "simuler &"; un typedef ou y at-il de meilleures façons de le faire?
La solution
C ++ 0x ajoutera les typedefs du modèle en utilisant le using
mot clé.
Votre solution déclare un nouveau type, et non un type & "; alias &", par exemple. vous ne pouvez pas initialiser un MyVectorType &
(référence) avec un vector<T>
. Ce n'est peut-être pas un problème pour vous, mais si c'est le cas, mais que vous ne voulez pas référencer de vecteur dans votre code, vous pouvez le faire:
template <typename T>
class MyVectorType {
public:
typedef std::vector<T> type;
};
Autres conseils
L'héritage n'est pas ce que vous voulez. Une approche plus idiomatique pour émuler une typedef basée sur un modèle est la suivante:
template <typename T> struct MyVectorType {
typedef std::vector<T> t;
};
Reportez-vous à la typedef comme ceci:
MyVectorType<T>::t;
C ++ n'est pas en mesure de créer un modèle à partir d'un typedef ou d'une classe basée sur un modèle.
Cela dépend de ce que vous entendez par typedef
: std::vector<size_t>
est légal - même si size_t
est un typedef - et std::string
est un std::basic_string<char>
pour <=>.
Ce que vous devez utiliser dépend de la manière dont il doit se comporter (résolution de surcharge, par exemple):
-
Si vous voulez que ce soit un nouveau type distinct
class Foo : public Whatever {};
Cependant, vous pouvez maintenant passer des pointeurs ou des références de
Foo
, aux fonctions acceptantWhatever
, de sorte que cela devienne un hybride. Dans ce cas, utilisez doncprivate
l'héritage etusing Whatever::Foo
des implémentations personnalisées pour exposer les méthodes de votre choix. -
Si vous voulez un synonyme de type
using Foo = Whatever;
Le premier a l'avantage qu'il est possible de prédéclarer une classe, mais pas un typedef.