[英]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
。
成員函數指針與普通的函數指針不同。 此外, myclass::f
在沒有&
情況下是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
> {};
您需要傳遞地址 - 它必須是指向成員函數的指針:
decltype(&myclass::f)
否則,語法解析為引用靜態函數 - 因此錯誤。 但是, &myclass::f
不是函數 - 您不能只是調用它( std::is_function
將返回false
)。
myclass::f
應該是函數調用,但是沒有提供參數,導致編譯器錯誤。
您可以使用operator&
來獲取成員函數的地址,例如&myclass::f
,但它是一個成員函數指針, std::is_function
將返回false
。
檢查 T 是否為函數類型。 像 std::function、lambdas、帶有重載 operator() 的類和函數指針這樣的類型不算作函數類型。
您可以使用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';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.