true_type与false_type

std::true_type和std::false_type

实际上是类型别名

20211207100448

是两个类型(类模板)

注意区分true_type与false_type与true和false区别

  • true_typefalse_type代表类型

  • true,false代表值

nmsp1::FalseType myfunc1();//返回假这种含义
nmsp1::TrueType myfunc2();//返回真这种含义

自己模拟实现

namespace nmsp1 {
	template<bool val>
	struct BoolConstant {
		using type = BoolConstant<val>;

		static constexpr bool value = val;
	};

	using TrueType = BoolConstant<true>;
	using FalseType = BoolConstant<false>;


	template<typename T,bool val>
	struct AClass
	{
		AClass() {
			cout << "AClass()执行了" << endl;
            //if(val) {
			//	T tmpa = 15;
			//}
			//else {
			//	T tmpa = "abc";	//int tmpa = "abc";
			//}

			//if constexpr (val) {
			//	T tmpa = 15;
			//}
			//else {
			//	T tmpa = "abc";	//int tmpa = "abc";
			//}

			AClassEx(BoolConstant<val>());//创建一个临时对象
		}

		void AClassEx(TrueType) {
			T tmpa = 15;
		}
		void AClassEx(FalseType) {
			T tmpa = "abc";
		}

		//当为ture时只会去编译重载版本的TureType
	};
}

nmsp1::AClass<int, true> tmpobj1;
//如果是第一条注释的if语句会报const char[4]无法转换为int
nmsp1::AClass<string, false> tmpobj2;
//如果是第一条注释的if语句会报无法从int转换为string

编译器设计时的考量,编译器是能够在编译器时期判断出来执行AClass类模板构造函数的哪个分支的,但从编译出代码这个角度来说,不管是哪个条件分支都会去编译,那么编译false分支就会报错.

if constexpr:属于编译期间if语句,可以解决上面
角度来说,不管是哪个条件分支都会去编译,那么编译false分支就会报错.

if constexpr:属于编译期间if语句,可以解决上面

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值