Question

J'écris une classe de modèle et je souhaite autoriser une méthode supplémentaire à exister uniquement pour un certain type de modèle. Actuellement, la méthode existe pour tous les types de modèles, mais provoque une erreur de compilation pour tous les autres types.

Ce qui est compliqué, c'est qu'il s'agit d'un opérateur surchargé (). Je ne sais pas si ce que je veux faire est réellement possible ici.

Voici ce que j'ai maintenant:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);
    typename T const& operator() (const Utility2<BASE>& foo) const;
};

Je veux que la version T& soit toujours disponible, mais la version T const& n'est disponible que si Utility2<BASE> est valide. À l'heure actuelle, les deux méthodes existent, mais essayer d'utiliser la version const donne une erreur de compilation étrange si Utility2<BASE> n'est pas valide. Je préfère avoir une erreur sensible, ou même une erreur "aucune fonction membre de ce type".

Est-ce possible?

MODIFIER : après avoir lu les documents sur les boosters, voici ce que j'ai trouvé, et cela semble fonctionner:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);

    template<typename U>
    typename boost::enable_if<boost::is_same<Utility2<BASE>, U>, T>::type const &
    operator() (const U& foo) const;
};

Donc, cette méthode n'existe pas à moins que quelqu'un essaie de l'utiliser avec Utility2, et ils ne peuvent créer un Utility2 que s'il est valide pour ce type BASE. Mais lorsqu'il n'est pas valide pour ce type BASE, MyClass ne perdra pas de temps à créer la méthode d'accesseur.

Était-ce utile?

La solution

Oui, c'est possible, mais pas directement avec le paramètre de modèle de classe.boost::enable_if ne peut être utilisé qu'avec un paramètre de modèle sur la méthode elle-même.Donc, avec un peu d'utilisation typedef:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:
  typedef Utility2<BASE> util;

  typename T& operator() (const Utility1<BASE>& foo);

  template<typename U>
  typename boost::enable_if<boost::is_same<util, U>, T>::type const &
  operator() (const U& foo) const;
};

Cela fonctionne, car Utility2 ne peut être créé qu'à partir d'un certain type BASE.Donc, si le type BASE est autre chose, la version const de operator () n'existera pas.

Donc, c'est une chose très mineure.Cela ne me rapporte pas beaucoup.Mais c'était chouette à faire.

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