基于自定义void_t实现的成员检测



我有一本完整的指南C++模板,我正在尝试实现一些描述的技术。其中之一是成员函数检测,但我的实现似乎不起作用。

我不能使用void_t,因为我使用的是 C++11,但我复制了定义,所以这应该不是问题。

以下是代码:

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实施可能有问题吗?

尝试以下void_t定义,除非您使用的是C++17:

template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;

根据 https://en.cppreference.com/w/cpp/types/void_t:

在 CWG 1558(C++14 缺陷(之前,别名模板中未使用的参数 不能保证确保SFINAE,可以忽略,所以更早 编译器需要更复杂的void_t定义,例如

这是 gcc 在 5.1 版之前的问题。

相关内容

  • 没有找到相关文章

最新更新