2011-12-21 4 views
1

Voici le code que je recherchais, Source code:Héritage Déroutant et modèles

template <typename T> 
struct function_traits 
    : public function_traits<decltype(&T::operator())> 
{}; 

si nous instancier certains foncteur X-à-dire function_traits<X>;, qui va construire la classe de base qui est function_traits<decltype(&X::operator())> en raison de l'héritage, mais construire function_traits<decltype(&X::operator())> sa base doit également être construit, ce qui pourrait être function_traits<decltype(Z)>

Je comprends function_traits<X>! = function_traits<Z>. N'est-ce pas un héritage récursif? 0_o. Comment tout fonctionne-t-il ensemble?

+0

Que se passe-t-il lorsque vous essayez? –

+0

Je ne comprends pas votre question. Ce code n'est pas valide sans une autre spécialisation de 'function_traits' pour les pointeurs de fonctions membres. – ildjarn

+0

@FreakEnum: Oui, ce code contient les spécialisations exactes dont je parlais. ;]] – ildjarn

Répondre

2

Ce code est illégal. Vous ne pouvez pas dériver d'un type incomplet, et au moment où vous essayez de dériver de function_traits, le type est incomplet.

struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

X<B> test; // error: invalid use of incomplete type ‘struct X<A>’ 

La seule façon que vous pouvez contourner cela est si le function_traits vous essayez de dériver est un type complet. Vous pouvez le faire en utilisant la spécialisation:

struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

template <> 
struct X<A> {}; // X<A> is now a complete type. 

X<B> test; // OK! Derives from X<A>, which is complete. 

Ici, X<A> est terminée lorsque vous essayez de tirer de lui, de sorte que vous êtes bien.

+0

Voici le tout Si vous pourriez vouloir regarder http://github.com/kennytm/utils/blob/master/traits.hpp –

+1

@FreakEnum: Comme vous pouvez le voir, il spécialise le modèle pour différents types de fonctions ci-dessous le premier définition, donc il a toujours une classe complète. Je suis sûr que KennyTM répondra à d'autres questions que vous avez :-) http://stackoverflow.com/users/224671/kennytm –

+0

Maintenant, cela a du sens pour moi. Merci :) –