6

出于好奇,我正在尝试使用该技巧的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<int>,它给出了编译错误:

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

现在,我的问题是,如果int T::*不适用于(int或等),那么void*为什么. 编译器不应该选择?yes checkno check

4

1 回答 1

10

yes并且no不是模板,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 可以开始了。

于 2011-07-03T15:27:00.607 回答