2016-04-13 2 views
3

я могу сделать следующее, чтобы обнаружить, если что-то есть функция:std :: is_function on member function?

void f() 
{ 
} 

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

Теперь, что произойдет, если я хочу сделать то же самое, но с функцией, которая является методом класса?

я наивно пытался сделать что-то вроде

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

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

Но я получаю

Call to non-static member function without an object argument 

Что я должен делать? Я хотел бы что-то вроде выше ... ну просто напечатать true.

+4

Это действительно чрезмерное количество интервалов. – Barry

ответ

4

Указатель функции-члена не совпадает с обычным указателем на функцию. Кроме того, myclass::f плохо сформирован без &. Для функций-членов существует 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

Вам нужно передать адрес - он должен быть указателя для функции члена:

decltype(&myclass::f) 

В противном случае, синтаксис разбирает как ссылающиеся на статическую функцию - значит ошибка. Однако &myclass::f не является функцией - вы не можете просто назвать ее (std::is_function вернет false).

2

decltype(myclass :: f) плохо сформирован.

Вы можете использовать std::is_member_function_pointer (std::is_member_function_pointer<decltype(&myclass::f)>::value).

Интересная вещь возможная реализация std::is_member_function_pointer воспользовавшись std::is_function:

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 должна быть функция ссылающееся, но аргументы не предусмотрено, которые вызывают ошибку компилятора.

Вы можете использовать operator& взять адрес функции члена, такой, как &myclass::f, но это указатель функции, std::is_function вернется false.

Проверяет, является ли T типом функции. Типы типа std :: function, lambdas, классы с перегруженным оператором() и указатели на функции не считаются типом функции.

Вы можете использовать std::is_member_function_pointer, чтобы проверить, не является ли он указателем на функцию нестатического элемента.

Смежные вопросы