1
template<class T>
struct is_class_or_union
{
    struct twochar { char _[2]; };
    template <class U>
    static char is_class_or_union_tester(void(U::*)(void));
    template <class U>
    static twochar is_class_or_union_tester(...);
    static const bool value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(char);
};

上記のコードはmeta_utils.hpp、boost ライブラリからのものです。

  1. is_class_or_union_testerメンバー関数へのポインターをstatic返し、取得する関数のようです(voidを返し、何も受け入れません)。char関数本体はなく、どこにも定義されていないようです。それがどのように機能するのかわかりません。何より、機能の目的がわかりません。
  2. 次のコードの概念がわかりません: static const bool value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(char); What is the sizeofoperator applied to? 彼らはここで何を見つけようとしていますか?
4

1 に答える 1

3

ここで採用されている手法は SFINAE (substitution failure is not an error) です。これはコンパイラーが可能な候補テンプレートの中から一致を選択するために使用する手法であり、具体的には、テンプレート パラメーターの無効な置換自体がその一致プロセス中にエラーにならない場合に使用されます。 . この場合、コンパイラは次の一致を見つけようとしています。

is_class_or_union_tester<T>(0)

間で選択できます。

template <class U>
static char is_class_or_union_tester(void(U::*)(void));

また

template <class U>
static twochar is_class_or_union_tester(...);

T がクラスの場合、クラスはメンバー関数を持つことができるため、最初の関数テンプレートが選択されます。T が共用体の場合、2 番目が選択されます。sizeof関数を実行せず、テンプレート宣言の戻り値の型にのみ作用することを思い出してください。戻り値の型が異なり、sizeof(char) と比較すると正しい値が返されることがわかります。

于 2013-08-30T05:05:24.740 に答える