我可以执行以下操作来检测某些内容是否为函数:
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
。
答案 0 :(得分: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;
}
答案 1 :(得分: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
> {};
答案 2 :(得分:1)
你需要传递地址 - 它必须是指针到成员函数:
decltype(&myclass::f)
否则,语法解析为引用静态函数 - 因此错误。但是,&myclass::f
不是函数 - 您只能调用它(std::is_function
将返回false
)。
答案 3 :(得分:0)
myclass::f
应该是函数调用,但是没有提供参数,这会导致编译器错误。
您可以使用operator&
获取成员函数的地址,例如&myclass::f
,但它是成员函数指针,std::is_function
将返回false
。
检查T是否为函数类型。类似std :: function,lambdas,带有重载operator()的类和指向函数的指针都不算作函数类型。
您可以使用std::is_member_function_pointer
来检查它是否是非静态成员函数指针。
答案 4 :(得分:0)
在C ++ 17中,您可以使用辅助函数std::is_member_function_pointer_v
。
#include <iostream>
#include <type_traits>
struct A {
int fun() const&;
};
int main()
{
std::cout << std::is_member_function_pointer_v<decltype(&A::fun)> << '\n';
}