2010-06-03 4 views
3

je suivant le scénario:Smplest façon de fournir une spécialisation de modèle pour les classes dérivées

class my_base { ... } 

class my_derived : public my_base { ... }; 


template<typename X> 
struct my_traits. 

Je veux me spécialiser my_traits toutes les classes dérivées de my_base y compris: à savoir

template<typname Y> // Y is derived form my_base. 
stryct my_traits { ... }; 

Je n'ai aucun problème à ajouter des balises, membres à my_base pour le rendre plus simple. J'ai vu des trucs mais je me sens toujours perdu. Comment cela peut-il être fait de manière simple et rapide?

+0

Dupliquer de http://stackoverflow.com/questions/281725/template-specialization-based-on-inherit-class, si cela suffit. – Beta

+0

@Beta, n'est pas là une manière plus simple? Comme je peux changer my_base arbitrairement, peut-être que cela peut être fait sans IsBaseOf? – Artyom

+0

Plus simple en C++ 11: http://stackoverflow.com/a/25934222/1132686 –

Répondre

1

Eh bien, vous n'avez pas besoin d'écrire votre propre isbaseof. Vous pouvez utiliser boost ou C++ 0x.

#include <boost/utility/enable_if.hpp> 

struct base {}; 
struct derived : base {}; 

template < typename T, typename Enable = void > 
struct traits; 

template < typename T > 
struct traits< T, typename boost::enable_if<std::is_base_of<base, T>>::type > 
{ 
    enum { value = 5 }; 
}; 

#include <iostream> 
int main() 
{ 
    std::cout << traits<derived>::value << std::endl; 

    std::cin.get(); 
} 

Il existe des problèmes de mise à l'échelle, mais je ne crois pas qu'ils soient meilleurs ou moins bons que l'alternative dans l'autre question.

+0

Merci ... Il semble qu'il n'y a rien de plus simple, mais cela se fait au moins avec une ligne (et peu d'en-têtes) – Artyom

Questions connexes