std :: is_function 成员函数?
std :: is_function on member function?
我可以执行以下操作来检测某项是否是函数:
void f()
{
}
int main()
{
std :: cout << std :: is_function <decltype(f)> :: value << std :: endl; // true
}
现在,如果我想做同样的事情,但使用的函数是 class 的方法,会发生什么情况?
我天真地试图做类似
的事情
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
.
您需要传递地址 - 它必须是指向成员函数的指针:
decltype(&myclass::f)
否则,语法将解析为引用静态函数 - 因此会出现错误。但是,&myclass::f
不是函数 - 您不能只调用它(std::is_function
将 return false
)。
成员函数指针与普通的函数指针不同。此外,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;
}
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
> {};
myclass::f
应该是函数调用,但是没有提供参数,导致编译错误。
可以用operator&
取成员函数的地址,比如&myclass::f
,但是是成员函数指针,std::is_function
会returnfalse
.
Checks whether T is a function type. Types like std::function, lambdas, classes with overloaded operator() and pointers to functions doesn't count as a function type.
可以使用std::is_member_function_pointer
判断是否为非静态成员函数指针
在 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';
}
我可以执行以下操作来检测某项是否是函数:
void f()
{
}
int main()
{
std :: cout << std :: is_function <decltype(f)> :: value << std :: endl; // true
}
现在,如果我想做同样的事情,但使用的函数是 class 的方法,会发生什么情况?
我天真地试图做类似
的事情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
.
您需要传递地址 - 它必须是指向成员函数的指针:
decltype(&myclass::f)
否则,语法将解析为引用静态函数 - 因此会出现错误。但是,&myclass::f
不是函数 - 您不能只调用它(std::is_function
将 return false
)。
成员函数指针与普通的函数指针不同。此外,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;
}
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
> {};
myclass::f
应该是函数调用,但是没有提供参数,导致编译错误。
可以用operator&
取成员函数的地址,比如&myclass::f
,但是是成员函数指针,std::is_function
会returnfalse
.
Checks whether T is a function type. Types like std::function, lambdas, classes with overloaded operator() and pointers to functions doesn't count as a function type.
可以使用std::is_member_function_pointer
判断是否为非静态成员函数指针
在 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';
}