【发布时间】:2018-09-14 07:54:44
【问题描述】:
我有这本书 C++ Templates the complete guide,我正在尝试实现一些描述的技术。其中之一是成员函数检测,但我的实现似乎不起作用。
我不能使用 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 实现可能有问题吗?
【问题讨论】:
-
你用的是什么编译器? Could not reproduce.
-
我使用的是 gcc 4.8.5
-
有可能升级吗? gcc5.1 是你需要的。
-
@YSC 你是说它只是一个编译器错误还是一个 C++11“问题”?
-
这是 C++11 的非保证,已在 C++14 中删除,但编译器之前已修复;至少 gcc 和 clang。
标签: c++ templates traits template-meta-programming sfinae