(C++模板编程):std::true_type与std::false_type

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";
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值