如何专门为模板类中的成员函数类型?

时间:2013-05-22 03:37:13

标签: 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...) ,但成员函数类型的对应语法是什么?

1 个答案:

答案 0 :(得分:0)

出现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。一个'&amp;'是必需的

以下适用于函数成员指针

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