2016-03-24 8 views
0

Ich habe zwei Klassen:Vererbung mit den Mitgliedfunktionszeigern und Vorlagen

class A { 
    public: 
     bool funA(); 
}; 
class B : public A { 
    pubic: 
     bool funB(); 
}; 

und eine Templat-Funktion, die einen Funktionszeiger nimmt und ruft sie dann gegen eine Liste von B:

template <typename T> 
std::vector<T> getFunc(T (B::func*)()) { 
....iterator through list of B's calling func.... 
} 

Wenn ich versuchen, getFunc(B::funA) aufrufen Ich bekomme einen Kompilierfehler, dass "keine getFunc (A :: funA) existiert ..."

Ich kann das Problem lösen, indem Sie einfach eine zweite getFunc t erstellen Hut nimmt A::func* anstelle von B ::, aber jetzt habe ich zwei Funktionen, die genau dasselbe tun. Gibt es eine Möglichkeit für mich, nur mit einer Implementierung von getFunc zu enden?

EDIT: Ich brauche eine vor C++ 11 Lösung.

Antwort

1

einfach den gesamten Parameter ableiten und deren Rückgabetyp extrahieren:

template<class F,class R=std::result_of_t<F(B&)>> 
std::vector<R> getFunc(F&&){return{};} 

std::result_of_t ist C++ 14, für eine C++ 11 kompatible Lösung, verwenden typename std::result_of<F(B&)>::type.

Für eine C++ 03-Lösung, einfach ableiten, den Klassentyp:

template <typename T, typename C> 
std::vector<T> getFunc(T (C::*func)()); 
+0

Welcher Header ist result_of_t in? #include bekomme ich keine solche Datei. – mjr

+0

@mjr Aktivieren Sie C++ 11 ('-std = C++ 11'). – 0x499602D2

+0

@mjr Konnten Sie es zur Arbeit bringen? – 0x499602D2

0

&B::funA hat Typ bool (A::*)(), nicht bool (B::*)(). Sie müssen eine static_cast: static_cast<bool (B::*)()>(&B::funA) durchführen.

+0

Das ist mir „ungültiger statischer Guss aus Typ 'Bool (A :: *)()' auf‚Bool (B bekommt: : *)() '" – mjr

+0

@mjr http://coliru.stacked-crooked.com/a/7820920cf2ec6609 – Simple