std::true_type和std::false_type
- 是两个类型(类模板)。
源码
// ALIAS TEMPLATE bool_constant template <bool _Val> using bool_constant = integral_constant<bool, _Val>; using true_type = bool_constant<true>; using false_type = bool_constant<false>;
- 相当于
using true_type = integral_constant<bool,true>; using false_type = integral_constant<bool,false>;
- 注意true_type,false_type与true,false的区别
- true_type,false_type:代表类型(类类型)
- true,false:代表值
- 注意于bool的区别,bool代表true也可以代表false,而true_type类型代表的就是true,false_type类型代表的就是false.
true_type func(); true func2(); //错误,true是一个值,不是类型 bool func2();
template <bool var> struct BoolConstant { using type = BoolConstant; //写成using type = BoolConstant<var>;也行 static constexpr bool value = var; }; using TrueType = BoolConstant<true>; using FalseType = BoolConstant<false>;
- a)TrueType和FalseType代表一个类类型,TrueType(std::true_type)代表一种true(真)的含义,而False_Type(std::false_type)代表一种false(假)的含义。
- b)一般是当作基类被继承。当作为基类被继承时,派生类也就具备了真或假的这种意味。
- is,比如is_pointer、is_union、is_function等类模板,都是继承自类似BoolConstant<true>或者BoolConstant<false>这样的基类来实现的。
- c)可以当作一种返回类型被使用,比如:
FalseType myfunc1(); //返回“假”这种含义 TrueType myfunc2(); //返回“真”这种含义
template <typename T,bool val> struct AClass { AClass() //构造函数 { cout << "AClass::AClass()执行了" << endl; if (val) { T tmpa = 15; } else { T tmpa = "abc"; //int tmpa = "abc"; } } }
- 调用
AClass<int, true> tmpobj1; AClass<string, false> tmpobj2;
- 编译器报错,两个分支编译器都进行了实例化:T tmpa = "abc";(当AClass<int, true> tmpobj1时 ) 实例化int tmpa = "abc"。
可改成编译期间进行判断,不在运行期间判断
template <typename T,bool val> struct AClass { AClass() //构造函数 { cout << "AClass::AClass()执行了" << endl; if constexpr (val) { T tmpa = 15; } else { T tmpa = "abc"; } } }
使用BoolConstant
template <typename T,bool val> struct AClass { AClass() //构造函数 { cout << "AClass::AClass()执行了" << endl; AClassEx(BoolConstant<val>()); //创建一个临时对象,成员函数AClassEx调用 } void AClassEx(TrueType abc) //BoolConstant<val>()如果val为真执行 { T tmpa = 15; } void AClassEx(FalseType) //BoolConstant<val>()如果val为假执行 { T tmpa = "abc"; } };