c++ - 如何专门针对模板类中的成员函数类型?

标签 c++ visual-studio-2012 c++11 template-specialization specialization

我刚刚测试了下面的代码,我发现 std::is_function 不接受成员函数类型。(我不确定这是否适用于其他编译器,我是使用 MVC++ 2012 年 11 月 CTP)

   class Ac {
    public:
      float af(int) {}
    };

    int main() {
     std::cout <<  std::is_function<decltype(Ac::af)>::value << '\n'; //output is 0
    }

所以我正在尝试实现它:

template<typename T>
struct is_member_function : std::false_type {};
template<typename T, typename R, typename... Args>
struct is_member_function<R (T::) (Args...)> : std::true_type {}; //this doesn't compile

对于成员函数指针类型,我们可以特化这个签名:R (T::*)(Args...) , 但是成员函数类型对应的语法是什么?

最佳答案

看来,via this link , 以下实现用于 is_member_function_pointer

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

因此,您可以使用 T U::* 确定某物是否是 U 类型的某物的成员指针,并且您可以确定 T 是否为函数类型。我不知道成员函数类型的任何语法,只知道成员函数指针类型。我必须查阅标准以查看是否存在这样的类型。

如果这种情况不存在,您可以实现一个包装类,它会像这样为您添加指针。

template<class T>
struct is_member_function {
    static const bool value = std::is_member_function_pointer<T*>::value;
};

但是当我尝试 decltype(some_type::some_member) 时,我收到一条错误消息,提示我不能只使用 some_type::some_member。需要一个“&”

以下适用于函数成员指针

std::is_member_function_pointer<decltype(&foo::hello)>::value

在我看来,您只能使用成员指针而不仅仅是成员类型。

上述 is_member_function_pointer_helper 的替代实现可能看起来像

template<class... Args, class R, class U>
struct is_member_function_pointer_helper<R (U::*)(Args...)> : std::true_type {};

关于c++ - 如何专门针对模板类中的成员函数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16683070/

相关文章:

javascript - Windows 商店应用程序的语言选择 : C++ or javascript ?

c++ - 将 Variadic 模板包转换为 std::initializer_list

C++11 main() 返回时终止线程?

c++ - 基于范围的 for 循环可以接受类型参数吗?

c++ - 具有基于柯南配置文件的不同版本的依赖项

c++ - 编译器错误 C2653 : not a class or namespace name

c++ - 使用 LValue 引用移动语义

c++ - 为什么这个 OpenGL-es 纹理绑定(bind)到 cocos2d 2.0 中的山丘?

c++ - OpenCV 4.5.1 与 3.4.2 的性能差异

c++ - 如何在exe中包含所有dll?