1. ホーム
  2. c++

[解決済み] C++のSFINAE例?

2022-03-04 09:09:14

質問

テンプレートのメタプログラミングをもっと極めたい。SFINAEが"substitution failure is not an error."の略であることは知っていますが、誰かSFINAEの良い使い方を示してくれませんか?

どのように解決するのですか?

一例です ( ここから ):

template<typename T>
class IsClassT {
  private:
    typedef char One;
    typedef struct { char a[2]; } Two;
    template<typename C> static One test(int C::*);
    // Will be chosen if T is anything except a class.
    template<typename C> static Two test(...);
  public:
    enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
    enum { No = !Yes };
};

いつ IsClassT<int>::Yes が評価されると、0は int int::* なぜなら、intはクラスではないので、メンバーポインターを持つことができないからです。もし SFINAE が存在しなければ、「0 cannot be converted to member pointer for non-class type int」のようなコンパイラエラーが発生するはずです。その代わり、単に ... という形式はTwoを返すので、intはクラス型ではないのでfalseと評価されます。