2016-12-06 6 views
1

Wenn ich eine Template-Klasse habenWenn Vorlage arg Funktionszeiger

template <class T> 
class foo 
{ /**/ } 

Wie erhalte ich, wenn T ein Funktionszeiger ist?

Es gibt std::is_pointer und std::is_function aber keine is_function_pointer

Antwort

4

einfach den Zeiger entfernen und überprüfen, ob das Ergebnis eine Funktion ist.

Hier Codebeispiel:

#include <utility> 
#include <iostream> 


template<class T> constexpr bool foo() { 
    using T2 = std::remove_pointer_t<T>; 
    return std::is_function<T2>::value; 
} 


int main() { 
    std::cout << "Is function? " << foo<void (int)>() 
       << "; is function pointer? " << foo<int (*)()>() << "\n"; 

} 
+0

ist Funktionszeiger dereferenzierte gleiche Art und Weise wie die der normalen Zeiger ?? 'int (* f)()' de-referenziert als '* f()' ?? – WARhead

+0

@WARhead, nicht dereferenzieren. Verwenden Sie 'remove_pointer_t 'wie oben gezeigt. – SergeyA

+0

okay, hab es. Ich werde 'remove_pointer_t' verwenden – WARhead

Verwandte Themen