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::*適用できない場合、なぜ置換が失敗しないのかということです。コンパイラは?を選択すべきではありません。intvoid*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 に答える