C++中std::conditional的使用说明

目录
  • std::conditional的使用
    • 具体用法
    • 具体理解为
    • 以下显示了更多的例子
  • 利用std::conditional实现变量的多类型

std::conditional的使用

今天在项目中发现C++11新特性中的std::conditional关键词,经过查询资料,学习到了其中含义。

具体用法

std::conditional<表达式, 类型1, 类型2>

具体理解为

如果表达式为真则定义的变量为类型1,如果表达式为假则定义的变量为类型2。

如:

typedef typename std::conditional<true, int, double>::type Type1;// => int Type1

则Type1的类型为int类型

以下显示了更多的例子

#include <iostream>
#include <type_traits>
#include <typeinfo>

int main()
{
    typedef typename std::conditional<true, int, double>::type Type1;
    typedef typename std::conditional<false, int, double>::type Type2;
     typedef typename std::conditional<sizeof(int) == sizeof(double), int, double>::type Type3;

    std::cout << typeid(Type1).name() << std::endl; // 输出:i (代表int类型)
    std::cout << typeid(Type2).name() << std::endl; // 输出:d (代表double类型)
    std::cout << typeid(Type3).name() << std::endl; // 输出:d (代表double类型)

    Type1 a = 3.1; // 由于Type1的类型为int所以3.1被强制转换为3
    Type2 b = 4.2; // Type2的类型为double,4.2保存在变量b中
    std::cout << a +  b << std::endl; // 3+4.2,最终输出为7.2
}

利用std::conditional实现变量的多类型

//std::conditional<bool, A, B>::type
const bool kEnableOffsetRender = false;
class LoginDialog : public std::conditional<kEnableOffsetRender, ui::WindowImplBase, nim_comp::ShadowWndBase>::type
{
public:
    //todo
};

/*
    if(kEnableOffsetRender)
    {
        type = ui::WindowImpBase;
    }
    else
    {
        type = nim_comp::ShadowWndBase;
    }
*/

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • c++11 新特性——智能指针使用详解

    c++11添加了新的智能指针,unique_ptr.shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated). 但是在实际的使用过程中,很多人都会有这样的问题: 不知道三种智能指针的具体使用场景 无脑只使用shared_ptr 认为应该禁用raw pointer(裸指针,即Widget*这种形式),全部使用智能指针 初始化方法 class A { public: A(int size){ this->size = size; } A(){} void Sh

  • C++11新特性“=default”,“=delete”的使用

    1. =default 和=delete 概述 任何事物的出现都必然有着其出现的理由,伴随着每一个新的概念产生都会带来一系列的便利和价值.C++在不断的演变与发展,与此同时,伴随着许多新的特性和功能产生.=default.=delete 是C++11的新特性,分别为:显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器不生成函数默认的缺省版本).C++11中引进这两种新特性的目的是为了增强对"类默认函数的控制",从而让程序员更加精准地去控制默认版本的函数.其具体的功能和使

  • C++新特性详细分析基于范围的for循环

    目录 1.概念 1.1.普通的for循环 1.2.基于范围的for循环 1.3.两者的区别 2.基于范围的for循环使用 2.1.值拷贝 2.2.引用 2.3.只读引用 2.4.关联容器 1.概念 // 普通的for循环 for(表达式 1; 表达式 2; 表达式 3) { // 循环体 } // 基于范围的for循环 for (declaration : expression) { // 循环体 } 1.1.普通的for循环 它的工作流程是: 1.执行表达式 1 2.如果表达式 2 为 tru

  • C++中std::conditional的使用说明

    目录 std::conditional的使用 具体用法 具体理解为 以下显示了更多的例子 利用std::conditional实现变量的多类型 std::conditional的使用 今天在项目中发现C++11新特性中的std::conditional关键词,经过查询资料,学习到了其中含义. 具体用法 std::conditional<表达式, 类型1, 类型2> 具体理解为 如果表达式为真则定义的变量为类型1,如果表达式为假则定义的变量为类型2. 如: typedef typename st

  • C++11中std::declval的实现机制浅析

    本文主要给大家介绍了关于C++11中std::declval实现机制的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 在vs2013中,declval定义如下 template <_Ty> typenamea dd_rvalue_reference<_Ty>::type declval() _noexcept; 其中,add_rvalue_reference为一个traits,定义为 template <_Ty> struct add_rvalue_ref

  • 浅谈SpringBoot中的@Conditional注解的使用

    概述 Spring boot 中的 @Conditional 注解是一个不太常用到的注解,但确实非常的有用,我们知道 Spring Boot 是根据配置文件中的内容,决定是否创建 bean,以及如何创建 bean 到 Spring 容器中,而 Spring boot 自动化配置的核心控制,就是 @Conditional 注解. @Conditional 注解是 Spring 4.0 之后出的一个注解,与其搭配的一个接口是 Condition,@Conditional 注解会根据具体的条件决定是否

  • 对python中各个response的使用说明

    Python django中我们经常用的response有django中的 JsonResponse, HttpResponse,还有DRF中的Response 在使用的时候,经常会不知道如何什么时候选择用哪个response 下面简单记录下这三个response的区别 1.HttpResponse 它的返回格式为:HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码) 1)它可以返回普通文本信息 HttpResponse("哈哈哈

  • Django模型中字段属性choice使用说明

    今天设计models时,用到了choice这个属性,用来限制用户做出选择的范围.比如说性别的选择(男或女). class User(AbstractUser): ... sex = models.CharField(verbose_name='性别',max_length=5,choices=(('male','男'),('female','女')),default='male') choice接收一个元组(保证值不可变),同理每一个选项也是由一个元组(value,display_name)构成

  • vue中destroyed方法的使用说明

    我们从destroyed的字面意思可知,中文意为是"销毁"的意思,当我们离开这个页面的时候,便会调用这个函数(具体可以看看vue的的生命周期),我们常用来销毁一些监听事件及定时函数,例如: // 销毁监听事件 destroyed() { window.removeEventListener('resize', this.resizeWin) } 从上函数可知,当用户离开页面的时候便会销毁监听事件. 补充知识:vue页面刷新时,执行了哪些生命周期--谨慎使用beforeDestroy和d

  • java中concat()方法的使用说明

    concat()方法介绍: 将几个字符串连接到一起. 例如: s = s.concat(str1);//将字符串str1接到字符串s后面 s = s.concat(str2);//将字符串str1接到字符串s后面 代码: public class Test { public static void main(String[] args){ String s = "厉害了,"; String str1 = "我的"; String str2 = "国!&qu

  • Java中Map的entrySet()使用说明

    由于Map中存放的元素均为键值对,故每一个键值对必然存在一个映射关系. Map中采用Entry内部类来表示一个映射项,映射项包含Key和Value Map.Entry里面包含getKey()和getValue()方法 Set<Entry<T,V>> entrySet() 该方法返回值就是这个map中各个键值对映射关系的集合. 可使用它对map进行遍历. Iterator<Map.Entry<Integer, Integer>> it=map.entrySet

  • C++11中std::move、std::forward、左右值引用、移动构造函数的测试问题

    关于C++11新特性之std::move.std::forward.左右值引用网上资料已经很多了,我主要针对测试性能做一个测试,梳理一下这些逻辑,首先,左值比较熟悉,右值就是临时变量,意味着使用一次就不会再被使用了.针对这两种值引入了左值引用和右值引用,以及引用折叠的概念. 1.右值引用的举例测试 #include <iostream> using namespace std; ​ //创建一个测试类 class A { public: A() : m_a(55) { } ​ int m_a;

  • C++中std::allocator的使用案例详解

    标准库中包含一个名为allocator的类,允许我们将分配和初始化分离.使用allocator通常会提供更好的性能和更灵活的内存管理能力.         new有一些灵活性上的局限,其中一方面表现在它将内存分配和对象构造组合在了一起.类似的,delete将对象析构和内存释放组合在了一起.我们分配单个对象时,通常希望将内存分配和对象初始化组合在一起.因为在这种情况下,我们几乎肯定知道对象应有什么值.当分配一大块内存时,我们通常计划在这块内存上按需构造对象.在此情况下,我们希望将内存分配和对象构造

随机推荐