has_member trait未检测到rvalue ref参数的成员函数

时间:2016-04-07 12:32:48

标签: c++ c++11

正如标题所说,我有一个带有rvalue引用参数的成员函数,我希望使用has_member特征来检测它。如果函数是模板化的,则has_member为false,即使我不使用该模板参数。

我认为代码会更好地澄清我的问题:

class A
{
public:
    void foo(int&&){}
};

HAS_MEMBER(foo); //macro that creates the struct has_member_foo<TYPE, SIGNATURE>

has_member_foo<A, void (A::*)(int&&) >::value == true


class A
{
public:
    template <typename T> //if the function is templated, it's not detected.
    void foo(int&&){}
};

has_member_foo<A, void (A::*)(int&&) >::value == false

请注意,我已经使用has_member trait的多个实现进行了测试。此外,如果我使用普通参考,一切都按预期工作。

我该如何测试此功能的存在?签名是错的还是我错过了其他什么?

此外,对于Visual Studio 2015,如果参数是通用引用,它可以工作,但对于Visual Studio 2012,它不会。

class A
{
public:
    template <typename T>
    void foo(T&&){}
};

has_member_foo<A,void (A::*)(int&&)>::value //true for vs2015, false for vs2012
has_member_foo<A,void (A::*)(int&)>::value //true for vs2015, false for vs2012
has_member_foo<A,void (A::*)(const int&)>::value //true for vs2015, false for vs2012

为has_member尝试的其中一个实现是: https://github.com/snaewe/typeswitch/blob/master/has_member.hpp

0 个答案:

没有答案