2016-04-13 14 views
3

Ich kann folgendes erkennen, ob etwas eine Funktion tun:std :: is_function auf Elementfunktion?

void f() 
{ 
} 

int main() 
{ 
    std :: cout << std :: is_function <decltype(f)> :: value << std :: endl; // true 
} 

Nun, was passiert, wenn ich das gleiche tun will, aber mit einer Funktion, die eine Methode einer Klasse ist?

ich naiv versuchte, so etwas wie

class myclass 
{ 
public: 
    void f() 
    { 
    } 
}; 

int main() 
{ 
    std :: cout << std :: is_function <decltype(myclass :: f)> :: value << std :: endl; 
} 

Aber ich

zu tun bekommen
Call to non-static member function without an object argument 

Was ich tun soll? Ich möchte etwas wie das oben zu .. gut, nur true drucken.

+4

Das ist eine wirklich übermäßige Menge an Abständen. – Barry

Antwort

4

Ein Mitglied Funktionszeiger ist nicht das Gleiche wie ein gewöhnlicher Zeiger auf Funktion. Auch myclass::f ist schlecht gebildet ohne &. Für Mitgliedsfunktionen gibt es std::is_member_function_pointer.

#include <iostream> 
#include <type_traits> 

class myclass 
{ 
public: 
    void f() {} 
}; 

int main() 
{ 
    std::cout << std::is_member_function_pointer<decltype(&myclass::f)>::value << std::endl; 
} 

Live on ideone

1

Sie müssen die Adresse weitergeben - es ist ein Zeiger auf Elementfunktion sein muss:

decltype(&myclass::f) 

Andernfalls wird die Syntax analysiert als eine statische Funktion Referenzierung - daher der Fehler. &myclass::f ist jedoch keine Funktion - Sie können es nicht einfach anrufen (std::is_function wird false zurückgeben).

2

decltype(myclass :: f) ist schlecht ausgebildet.

Sie können std::is_member_function_pointer (std::is_member_function_pointer<decltype(&myclass::f)>::value) verwenden.

Das Interessante ist, eine mögliche Implementierung von std::is_member_function_pointer Vorteil std::is_function unter:

template< class T > 
struct is_member_function_pointer_helper : std::false_type {}; 

template< class T, class U> 
struct is_member_function_pointer_helper<T U::*> : std::is_function<T> {}; 

template< class T > 
struct is_member_function_pointer : is_member_function_pointer_helper< 
            typename std::remove_cv<T>::type 
            > {}; 
0

myclass::f soll Funktion rufenden sein, aber die Argumente nicht vorgesehen ist, die den Compiler-Fehler verursachen.

können Sie operator& verwenden, um die Adresse der Member-Funktion, wie &myclass::f zu nehmen, aber es ist ein Funktionszeiger Mitglied wird std::is_functionfalse zurück.

Prüft, ob T ein Funktionstyp ist. Typen wie std :: function, lambdas, Klassen mit überladenem operator() und Pointer auf Funktionen zählen nicht als Funktionstyp.

Sie können std::is_member_function_pointer verwenden, um zu überprüfen, ob es sich um einen nicht statischen Mitgliedsfunktionszeiger handelt.

Verwandte Themen