https://zhuanlan.zhihu.com/p/463484892
https://blog.csdn.net/clever101/article/details/79426116
typedef uint8_t Yes;
typedef struct {
uint8_t padding[2];
} No;
template< typename Type >
struct IsClass {
private:
template< typename AnswerYes >
static Yes TYesNoTester(void(AnswerYes::*)(void));
template< typename AnswerNo >
static No TYesNoTester(...);
public:
enum {
Result = sizeof(TYesNoTester<Type>(0)) == sizeof(Yes)
};
};
int main()
{
IsClass<int> a;
cout << a.Result << endl;
return 0;
}
TYesNoTester为两个函数重载;
当且仅当,传入的类型Type为class的时候,AnswerYes::*才合法。
AnswerYes::*为类成员函数指针。
由于传入的类型Type为int,所以编译器选择了:
template< typename AnswerNo >
static No TYesNoTester(...);
No的长度为2个字节;Yes的长度为1个字节;所以Result为0。
输出的结果就是0。
这段代码参考behaviac的源代码。