C++ std::conditional的说明

【标准库中的实现方式】

template <bool b, class T, class U> //泛化版本
struct conditional 
{ 
    using type = T; //type类型别名
};
 
template <class T, class U>
struct conditional<false, T, U> 
{
    using type = U;
};


很显然,bool值只要为false就执行特化版本,即type = U;bool值为true才去执行泛化版本,即type = T;
如果b值为true,那么type这个类型别名所代表的类型就是conditional类模板的第二个模板参数T,否则就是conditional类模板第三个模板参数U。
所以这个类模板看起来表达的是一种if-then-else逻辑。
其实现逻辑不难联想到三目运算符    bool b :type = T   ? type =U;
【调用测试】

std::conditional<true, int, double>::type tmp1; 
std::conditional<false, int, double>::type tmp2;
 
cout << "tmp1的类型为:" << typeid(decltype(tmp1)).name() << endl;
cout << "tmp2的类型为:" << typeid(decltype(tmp2)).name() << endl;


【输出】

【总结】

根据给进来的布尔值不同,做到了让一个变量可能会有多种不同的类型的效果——范例中变量可能是int类型,也可能是double类型。
【引例】

int i = 35;
if (i > 100)
{
    cout << "i > 100" << endl;
}
else
{
    if (i > 80)
    {
        cout << "i > 80并且 <=100" << endl;
    }
    else
    {
        if (i > 40)
        {
            cout << "i > 40并且 <= 80" << endl;
        }
        else
        {
            cout << "i <= 40" << endl;
        }
    }
}


std::conditional类模板其逻辑类似是一种if-then-else
【需求】

定义一个名字叫做tsvar的变量,根据某个常量(取名为j)值的不同,tsvar变量的类型也不同:
a)j如果大于100,那么tsvar的类型是double类型,
b)j如果在80-100之间,那么tsvar的类型是float类型,
c)j如果在40-80之间,那么tsvar的类型是int类型,
d)j如果不超过40,那么tsvar的类型是char类型。
【实现】

constexpr int j = 35; //假设给进去35
 
std::conditional<
    (j > 100), double,  //值>100,tsvar是double,
    std::conditional<
        (j > 80), float, //值在80-100之间,那么tsvar是float类型。
        std::conditional<
            (j > 40), int,  //值在40-80之间,那么tsvar是int类型。
            char       //值不超过40,tsvar是char类型
        >::type
    > ::type
>::type   tsvar;



out << "tsvar的类型为:" << typeid(decltype(tsvar)).name() << endl; //char


总结: std::conditional虽然使用不复杂,但是他通常适合实现真或者假两种分支,如果要支持多分支,那么可以看到,写出来的代码不好看。

                        
原文链接:https://blog.csdn.net/baidu_41388533/article/details/109706222

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值