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

时间:2018-09-14 07:54:45

标签: c++ templates traits template-meta-programming sfinae

我已经获得了《 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实现可能有问题吗?

0 个答案:

没有答案