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);
};
以上代码来自boost库的meta_utils.hpp
。
is_class_or_union_tester
似乎是static
函数,返回char
并指向成员函数(返回void并且不接受任何内容)。没有功能体,似乎没有在其他任何地方定义。我不明白它是如何工作的,最重要的是,我不明白该功能的目的。static const bool value = sizeof(is_class_or_union_tester<T>(0)) == sizeof(char);
应用sizeof
运算符的是什么?他们想在这里找到什么?答案 0 :(得分: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)的比较返回正确的值。