【问题标题】:std :: is_function on member function?std :: is_function 关于成员函数?
【发布时间】:2016-04-13 15:24:52
【问题描述】:

我可以执行以下操作来检测某个东西是否是函数:

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

【问题讨论】:

  • 这确实是过多的间距。

标签: c++ function templates std


【解决方案1】:

成员函数指针与普通的函数指针不同。此外,myclass::f 在没有&amp; 的情况下格式不正确。对于成员函数,存在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

【讨论】:

    【解决方案2】:

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

    您可以使用std::is_member_function_pointer (std::is_member_function_pointer&lt;decltype( &amp;myclass::f )&gt;::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
                                        > {};
    

    【讨论】:

      【解决方案3】:

      您需要传递地址 - 它必须是指向成员函数的指针

      decltype(&myclass::f)
      

      否则,语法会被解析为引用静态函数 - 因此会出现错误。然而,&amp;myclass::f 不是一个函数——你不能只调用它(std::is_function 将返回false)。

      【讨论】:

        【解决方案4】:

        myclass::f应该是函数调用,但是没有提供参数,导致编译错误。

        可以用operator&amp;取成员函数的地址,比如&amp;myclass::f,但它是一个成员函数指针,std::is_function会返回false

        检查 T 是否为函数类型。 std::function、lambdas、具有重载 operator() 的类和指向函数的指针等类型不计入函数类型。

        您可以使用std::is_member_function_pointer来检查它是否是一个非静态成员函数指针。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 2017-01-18
            • 2010-12-27
            • 2016-09-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多