怎样用eclipse做网站,万网官网入口,哪些论坛是wordpress,网站建设的作用有哪些方面用成员函数重载实现is_class
std::is_class功能#xff0c;是一个C11标准中用于判断某个类型是否为一个类类型#xff08;但不是联合类型#xff09;的类模板。当时在讲解的时候并没有涉及std::is_class的实现代码#xff0c;在这里实现一下。简单地书写一个IsClass类模板…用成员函数重载实现is_class
std::is_class功能是一个C11标准中用于判断某个类型是否为一个类类型但不是联合类型的类模板。当时在讲解的时候并没有涉及std::is_class的实现代码在这里实现一下。简单地书写一个IsClass类模板实现即可代码如下。
#include killCmake.h#includestringusing namespace std;class A
{
};
class B : public A
{
public:B(int x) : x_(x){}
private:int x_;
};templatetypename T1,typename T2
struct IsSameType
{static const bool value false;
};templatetypename T1
struct IsSameTypeT1, T1
{static const bool value true;
};templatetypename T
class IsClass
{
private:templatetypename Ustatic std::integral_constantbool, !std::is_unionU::value test(int U::*);templatetypenamestatic std::integral_constantbool, false test(...);public:static constexpr bool value IsSameTypedecltype(testT(nullptr)), std::integral_constantbool, true::value;
};int main()
{std::cout IsClassA::value std::endl;std::cout IsClassB::value std::endl;std::cout IsClassint::value std::endl;return 0;
} 1依旧是两个同名的静态成员函数模板test()返回的都是用std::integral_constant包装的类型。一个test()的返回类型是std::integral_constantbool,!std::is_unionU::value这表示如果U其实也是T的类型不是一个联合那么返回的类型将变成std::integral_constantbool, true否则返回的类型将变成std::integral_constantbool, false。2对于这两个test()静态成员函数调用的时候编译器依旧会优先选择有具体形参的test()版本特别要注意这个形参的写法int U::*。这个写法可能刚开始看不懂它其实是一个成员变量指针如下面这行代码
int A::*mp nullptr;这行代码表示有一个名字叫作mp的指针这个指针可以指向类A中的一个int类型的成员变量。请注意这并不表示类A中一定要有一个int类型的成员变量类A即便是空类都没关系。从语法上来讲这行代码没有问题当然如果要给mp指针赋一个非nullptr的值那么类A中就需要有一个int类型的成员变量了。所以int U::*这个形参代表的就是一个成员变量指针只不过这里简化书写把指针名去掉了因为指针名用不到索性就省略了。如果U是一个类类型那么从语法规则上来讲int U::*这种写法就符合语法规则否则如果U不是一个类类型这种写法就不符合语法规则根据SFINAE特性就会匹配第2个test()版本而一旦匹配第2个test()版本则一定总结如果传递给IsClass的类型模板参数T是一个类类型但不是一个联合类型那么test()返回的就是std::integral_constantbool, true类型否则返回的就是std::integral_constantbool, false类型。会匹配成功。3静态成员变量value的取值取决于test()的返回类型与std::integral_constantbool,true类型的比较。如果两个类型相同则value的最终取值是一个布尔值true1否则就是false0。如果value最终取值为1就表示通过模板参数传递给IsClass的是一个类类型如果value最终取值为0就表示通过模板参数传递给IsClass的不是一个类类型但可能是一个联合类型。