正如标题所说,我有一个带有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