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?

Était-ce utile?

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 acceptant Whatever, de sorte que cela devienne un hybride. Dans ce cas, utilisez donc private l'héritage et using 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top