2016-07-20 27 views
1

Da ich die undefined Funktion vorging:Wie kann ich Übergeben Sie eine nicht definierte Methode wie ein nicht definiert Funktion

void foo(char, short); 

I learned how die Art tuple der Argumente zu erhalten, indem decltype(m(foo)) mit dieser Funktion aufrufen:

template <typename Ret, typename... Args> 
tuple<Args...> m(Ret(Args...)); 

ich möchte nun eine undefined Methode zu übergeben:

struct bar { void foo(char, short); }; 

ich versucht hatte, m wie Umschreiben:

template <typename Ret, typename C, typename... Args> 
tuple<Args...> m(Ret(C::*)(Args...)); 

Aber wenn I try to call this in ähnlicher Weise mit decltype(m(bar::foo)) ich den Fehler:

invalid use of non-static member function void bar::foo(char, short int)

Wie kann ich diese Methode übergeben, wie ich für die Funktion haben ?

+1

Denken Sie daran, dass ein nicht-statisches Element Funktionszeiger eine Instanz seiner Klasse (ein Objekt), auf dem muss arbeiten . Eine Möglichkeit, Elementfunktionszeiger mit einem Objekt zu übergeben, ist die Funktion std :: function. Siehe das 'print_add' Beispiel: http://en.cppreference.com/w/cpp/utility/functional/function –

+0

@RichardCritten Beachten Sie die" ** undefined ** Funktion "und" ** undefined ** Methode "' Funktion 'Objekte werden nicht funktionieren, sie brauchen eine Adresse. Ehrlich gesagt bin ich mir nicht einmal sicher, wie 'decltype (m (foo))' 'funktioniert, ich bin nur irgendwie dabei. –

Antwort

2

Wenn Sie nur decltype auf sie benutzen wollen, müssen Sie einfach eine zusätzliche &:

decltype(m(&bar::foo)) 
+0

Beachten Sie die "** undefined ** Methode" Ich kann die Adresse nicht nehmen. Ich werde diejenigen in der Frage kühnen, so dass es klar ist, warum dies keine Lösung ist. Es ist fast so, dass die Funktion als Ausdruck behandelt wurde, als ich sie bestanden habe. Nicht sicher, wie man etwas Ähnliches mit einer Methode macht. –

+1

@ JonathanMee Warum meinst du mit "** undefined ** Methode"? Eine Methode, die deklariert, aber nicht definiert wird? Wenn ja, funktioniert der obige Code perfekt. Der Ausdruck, den Sie "declltype" geben, wird nie ausgewertet. – Holt

+0

"Der obige Code funktioniert perfekt" [sic] Ich schätze, Sie haben es nicht getestet, bevor Sie diese Aussage gemacht haben: http://stackoverflow.com/q/38402133/2642059 Es wird überhaupt nicht funktionieren. –