2014-05-05 4 views
2

Prenez la hiérarchie de classe suivante:Déduire classe parente de méthode héritée en C++

template<typename T> 
class Foo { 
public: 
    T fooMethod() { ... } 
}; 
class Moo : public Foo<bool> { 
    ... 
}; 

Si je maintenant quelque part écrire Moo::fooMethod le compilateur déduira Foo<bool>::fooMethod. Comment puis-je déduire Foo<bool> en tant que parent de fooMethod moi-même avant la compilation? Motivation: le compilateur n'autorisera pas le Foo<bool>::fooMethod à passer en paramètre de modèle pour bool (Moo::*)() puisqu'il sera de type bool (Foo<bool>::*)() dans ce contexte. Mais puisque j'ai l'héritage multiple je ne sais pas quel parent sera fooMethod, il doit être déduit.

+0

Je ne suppose pas que [utiliser une référence rvalue] (http://ideone.com/AZsFOx) est une possibilité? – WhozCraig

+0

Une simple fonction de passage est-elle acceptable/pas trop gênante? –

Répondre

1

Si je comprends correctement le problème, il est possible d'en déduire la classe une fonction de membre est définie en utilisant le trait suivant:

template<typename> 
struct member_class_t; 

template<typename R, typename C, typename... A> 
struct member_class_t <R(C::*)(A...)> { using type = C; }; 

template<typename R, typename C, typename... A> 
struct member_class_t <R(C::*)(A...) const> { using type = C const; }; 

// ...other qualifier specializations 

template<typename M> 
using member_class = typename member_class_t <M>::type; 

après quoi vous pouvez écrire

member_class<decltype(&Moo::fooMethod)> 

donnant Foo<bool>.

Pour définir member_class plus généralement, vous devez également prendre en compte volatile et ref-qualificatifs, ce qui donne un total d'environ 12 spécialisations. Une définition complète est here.

+0

Cette décomposition simple est exactement ce que je cherchais, génial! :) Merci beaucoup! –

Questions connexes