为什么在尝试类成员指针时,SFINAE 技巧对非类类型不起作用?

发布于 2024-11-18 09:55:47 字数 761 浏览 4 评论 0原文

出于好奇,我尝试了 is_class 使用 sizeof() 技巧构造。以下是代码:

template<typename T>
struct is_class
{
  typedef char (&yes)[7];
  typedef char (&no)[3];

  static yes check (int T::*);
  static no check (...);

  enum { value = (sizeof(check(0)) == sizeof(yes)) };
};

问题是当我实例化 is_class 时,它给出编译错误:

error: creating pointer to member of non-class type ‘int’

现在,我的问题是,如果 int T::* 不适用于int(或void*等)那么为什么替换不会失败是检查。编译器不应该选择不检查吗?

With curiosity, I was trying an alternate implementation of is_class construct using the sizeof() trick. Following is the code:

template<typename T>
struct is_class
{
  typedef char (&yes)[7];
  typedef char (&no)[3];

  static yes check (int T::*);
  static no check (...);

  enum { value = (sizeof(check(0)) == sizeof(yes)) };
};

Problem is when I instantiate is_class<int>, it gives compile error:

error: creating pointer to member of non-class type ‘int’

Now, my question is, if int T::* is not applicable for int (or void* etc.) then why doesn't substitution fail for yes check. Shouldn't compiler select the no check ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦境 2024-11-25 09:55:47

yesno 不是模板,SFINAE 不可能应用于它们。您需要这样做:

template<typename T>
struct is_class
{
  typedef char (&yes)[7];
  typedef char (&no)[3];

  template <typename U>
  static yes check (int U::*);

  template <typename>
  static no check (...);

  enum { value = (sizeof(check<T>(0)) == sizeof(yes)) };
};

现在 SFINAE 可以启动了。

yes and no are not templates, SFINAE cannot possibly apply to them. You need to do this:

template<typename T>
struct is_class
{
  typedef char (&yes)[7];
  typedef char (&no)[3];

  template <typename U>
  static yes check (int U::*);

  template <typename>
  static no check (...);

  enum { value = (sizeof(check<T>(0)) == sizeof(yes)) };
};

Now SFINAE can kick in.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文