簡體   English   中英

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 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;
}

住在ideone上

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM