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

Live on 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
                                    > {};

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