Comment tester au moment de la compilation si la classe B est dérivée de std :: vecteur? Comment tester au moment de la compilation si la classe B est dérivée de la famille de modèles? P> Utilisation: p>
3 Réponses :
Essayez ceci: Utilisation: p> Remarque: em> dans la ligne marquée # 1 code>, vous pouvez également faire accepter votre trait d'accepter tout modèle em> qui en a au moins un, mais éventuellement plus d'arguments de type par écrit: p>
Si vous utilisez Modèle
Le problème avec cette approche est qu'il ne fonctionnera que pour les modèles avec un seul argument. Même si vous augmenterez de prendre le habituel i> deux arguments de std :: vecteur code> La mise en œuvre est autorisée à ajouter des paramètres de modèle supplémentaires (tant qu'il fournit des valeurs par défaut pour ces paramètres ), donc il ne sera pas 100% portable
@Oktalist: Pourriez-vous s'il vous plaît poster un contre-exemple? J'ai une idée de la façon dont je pourrais résoudre ce problème si le problème existe effectivement.
Mon erreur. §14.8.2.1 (4) Contient la règle spéciale qui permet une déduction de l'argument de modèle à déduire un simple-template-id i> une classe de base du type d'argument. Aucune telle règle pour les conversions définies par l'utilisateur.
J'ai eu la même situation que je devais savoir si une classe est dérivée d'un vecteur (comme) -Class. Malheureusement, il n'y a pas de macros C ++ - 11 ou variadiques autorisés dans mon projet. Donc, ma solution était un mélange de Réponse de Kerrek et ce Article avec du code GoogletSTest à la fin:
#include <vector> template <typename T> class is_derived_from_vector { typedef char Yes_t[1]; typedef char No_t[2]; static No_t& test(const void* const); template <typename U> static Yes_t& test(const std::vector<U>* const); public: static const bool value = ((sizeof(test(static_cast<T*>(0)))) == (sizeof(Yes_t))); }; template<class T> struct X {}; struct A : X<int> {}; struct B : std::vector<char> {}; TEST(Example, IsDerivedFrom) { EXPECT_FALSE(is_derived_from_vector<A>::value); EXPECT_TRUE(is_derived_from_vector<B>::value); }
Je cherchais une solution à ce problème il y a peu de temps et après consultation avec
Conception moderne C ++: Programmation générique et modèles de conception appliqués P> blockQuote>
J'ai pu construire ce qui suit, ce qui est plus ou moins similaire à ce qui a été fourni dans les commentaires. p>
xxx pré> p>
Avec des métaprogramming de modèle, il est important de la rendre explicite si vous avez besoin d'une solution C ++ 03 ou une solution C ++ 11 est bonne (bien que je ne sois pas sûr que C ++ 11 puisse aider ici). Et comme une remarque intelligente, étant donné que vous ne devez jamais hériter de conteneurs standard, le trait original est simple:
faux code>: p
C ++ 03. J'utilise le compilateur MSVC 2010. Par conséquent, j'accepte d'utiliser
déclinger code> en plus.
std :: vecteur code> est par exemple ony. Si vous ne connaissez pas la solution C ++ 03, la solution C ++ 11 est également la bienvenue.