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函数返回char并获取指向成员函数的指针(返回 void 并且不接受任何内容)。没有函数体,它似乎没有在其他任何地方定义。我不明白它是如何工作的,最重要的是,我不明白这个功能的目的。
  2. 我不明白以下代码的概念: 运算符适用于什么static const bool value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(char);sizeof他们想在这里找到什么?
4

1 回答 1

3

这里使用的技术是 SFINAE(替换失败不是错误),这是编译器用来在可能的候选模板之间选择匹配项的技术,特别是在匹配过程中,模板参数的无效替换本身并不是错误. 在这种情况下,编译器会尝试为以下内容查找匹配项:

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 是一个联合,它将选择第二个。回想一下,sizeof它不会执行函数,只会作用于模板声明中的返回类型。您会看到返回类型不同,这使得与 sizeof(char) 的比较返回正确的值。

于 2013-08-30T05:05:24.740 回答