成员函数的std :: is_function?

时间:2016-04-13 15:24:53

标签: c++ function templates std

我可以执行以下操作来检测某些内容是否为函数:

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

5 个答案:

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

Live on ideone

答案 1 :(得分:2)

decltype(myclass :: f)格式不正确。

您可以使用std::is_member_function_pointerstd::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';
}