我已经获得了《 C ++模板》一书的完整指南,并且我正在尝试实现一些上述技术。其中之一是成员函数检测,但是我的实现似乎无法正常工作。
我不能像使用C ++ 11那样使用void_t,但是我复制了定义,所以这应该不是问题。
以下是代码:
namespace nt_detail
{
template< class... >
using void_t = void;
}
template<typename T, typename = nt_detail::void_t<>>
struct HasHelloMember
: std::false_type {};
template<typename T>
struct HasHelloMember<T,
nt_detail::void_t<decltype(std::declval<T>().hello())>>
: std::true_type {};
这里是测试之一:
class ZZZ
{
};
class ZZZ2
{
public:
void hello()
{}
};
int main()
{
if(HasHelloMember<ZZZ>::value)
{
std::cout << "ZZZ has hello" << std::endl;
}
else
{
std::cout << "ZZZ has NOT hello" << std::endl;
}
if(HasHelloMember<ZZZ2>::value)
{
std::cout << "ZZZ2 has hello" << std::endl;
}
else
{
std::cout << "ZZZ2 has NOT hello" << std::endl;
}
}
在两种情况下,我都会打招呼。我的void_t实现可能有问题吗?