`
xuning2516
  • 浏览: 8099 次
  • 性别: Icon_minigender_1
  • 来自: 江西
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

C++ stander library--type traits and type utility

 
阅读更多

C++11 提供了许多的类型特征和型别实用函数。

1 declval

01122   /// declval
01123   template<typename _Tp>
01124     struct __declval_protector
01125     {
01126       static const bool __stop = false;
01127       static typename add_rvalue_reference<_Tp>::type __delegate();
01128     };
01129 
01130   template<typename _Tp>
01131     inline typename add_rvalue_reference<_Tp>::type
01132     declval() noexcept
01133     {
01134       static_assert(__declval_protector<_Tp>::__stop,
01135             "declval() must not be used!");
01136       return __declval_protector<_Tp>::__delegate();
01137     }

Utility to simplify expressions used in unevaluated operands(such as the operands ofsizeofanddecltype).. 返回右值引用,用于不求值的操作,使得在不需要指定构造函数的额情况下使用它的成员函数。因为他是一个无值环境所以你不能对他进行求值操作。例如:

// declval example
#include <utility>      // std::declval
#include <iostream>     // std::cout

struct A {              // abstract class
  virtual int value() = 0;
};

class B : public A {    // class with specific constructor
  int val_;
public:
  B(int i,int j):val_(i*j){}
  int value() {return val_;}
};

int main() {
  decltype(std::declval<A>().value()) a;  // int a
std::cout <<std::declval<A>().value()<< '\n'; //出错,编译不成功
decltype(std::declval<B>().value()) b; // int b

decltype(B(0,0).value()) c; // same as above (known constructor)

std::cout<<c<<std::endl; // a = b = B(10,2).value(); std::cout << a << '\n'; //输出:20 return 0;}
2 common_type

 1788   /// common_type
 1789   template<typename... _Tp>
 1790     struct common_type;
 1791 
 1792   // Sfinae-friendly common_type implementation:
 1793 
 1794   struct __do_common_type_impl
 1795   {
 1796     template<typename _Tp, typename _Up>
 1797       static __success_type<typename decay<decltype
 1798                 (true ? std::declval<_Tp>()
 1799                  : std::declval<_Up>())>::type> _S_test(int); //转换成共同类型的核心,使用三目运算符自动转换成共同类型,这里使用的是隐式转换
 1800 
 1801     template<typename, typename>            
 1802       static __failure_type _S_test(...);  //?
 1803   };
 1804 
 1805   template<typename _Tp, typename _Up>
 1806     struct __common_type_impl
 1807     : private __do_common_type_impl
 1808     {
 1809       typedef decltype(_S_test<_Tp, _Up>(0)) type;
 1810     };
 1811 
 1812   struct __do_member_type_wrapper
 1813   {
 1814     template<typename _Tp>
 1815       static __success_type<typename _Tp::type> _S_test(int);
 1816 
 1817     template<typename>
 1818       static __failure_type _S_test(...);
 1819   };
 1820 
 1821   template<typename _Tp>
 1822     struct __member_type_wrapper
 1823     : private __do_member_type_wrapper
 1824     {
 1825       typedef decltype(_S_test<_Tp>(0)) type;
 1826     };
 1827 
 1828   template<typename _CTp, typename... _Args>
 1829     struct __expanded_common_type_wrapper
 1830     {
 1831       typedef common_type<typename _CTp::type, _Args...> type;
 1832     };
 1833 
 1834   template<typename... _Args>
 1835     struct __expanded_common_type_wrapper<__failure_type, _Args...>
 1836     { typedef __failure_type type; };
 1837 
 1838   template<typename _Tp>
 1839     struct common_type<_Tp>
 1840     { typedef typename decay<_Tp>::type type; };
 1841 
 1842   template<typename _Tp, typename _Up>
 1843     struct common_type<_Tp, _Up>
 1844     : public __common_type_impl<_Tp, _Up>::type
 1845     { };
 1846 
 1847   template<typename _Tp, typename _Up, typename... _Vp>
 1848     struct common_type<_Tp, _Up, _Vp...>
 1849     : public __expanded_common_type_wrapper<typename __member_type_wrapper<
 1850                common_type<_Tp, _Up>>::type, _Vp...>::type
 1851     { };

这段代码还是不甚理解,只知道他是一个递归定义解决可变参数的问题,真正求共同类型使用的条件运算符?:,所使用的还是隐式转换。(待跟进...)





  


  
分享到:
评论

相关推荐

    stander-input-output.rar_LPC2103_lpc2103 x

    在标题"stander-input-output.rar_LPC2103_lpc2103 x"中,关键词"stander-input-output"指代的是标准输入输出(Standard Input Output,简称stdio),这是计算机科学中的基本概念,涉及程序与用户之间的交互。...

    jstl ,stander ,Mysql-connector-java 三个框架包

    本篇文章将详细介绍标题中提及的三个框架包:JSTL(JavaServer Pages Standard Tag Library)、Standard以及Mysql-connector-java。 1. JSTL(JavaServer Pages Standard Tag Library): JSTL 是一套用于Java...

    Apache的jstl包和stander包

    Apache的JSTL(JavaServer Pages Standard Tag Library)和Standard包是Java Web开发中的关键组件,主要用于增强JSP页面的功能性和可维护性。在描述中提到的“连接数据库”是JSTL的一部分功能,它通过引入特定的标签...

    aec-q100 stander file

    AEC-Q100标准是汽车电子领域内用于集成电路(IC)可靠性测试和验证的关键文档。这份由汽车电子委员会(Automotive Electronics Council, AEC)制定的标准,详细规定了基于故障机制的应力测试资格认证流程,旨在确保...

    rancher-devops服务

    rancher-devops服务档案说明stander stander-rancher-pipeline.yaml rancher stander-rancher-pipeline.yaml :Rancher专用管道样板rancher-pipeline-example.ipynb :开发者教学说明档案pipeline-simulator.sh :...

    V-by-One-HS Standard,Version 1.4,December 15, 2011.pdf

    2.1.2 加扰器和解扰器(Scrambler and Descrambler) 描述数据加扰和解扰过程,以减少传输过程中的干扰和信号损失。 2.1.3 编码器和解码器(Encoder and Decoder) 详细说明在发送端对数据进行编码的过程,以及在...

    calibration toolbox for stander camera

    MATLAB 编写,通过栅格图像实现camera参数的确定,可用来确定未知camera的参数或图像矫正。 该程序出自:http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/example.html

    How to quickly add Monitor

    例如,如果要添加一个名为"bltvmstr103"的TVM服务器监控,项目名为"Stander Monitor",监控配置文件名为"Test",已确保该项目在Performance Center中初始化,那么可以在"MI_LRDB"数据库上执行如下SQL: ```sql Exec...

    jstl.jar_standard.jar 1.1版本

    JSTL(JavaServer Pages Standard Tag Library)是Java服务器页面的标准标签库,它提供了一系列的标签来简化JSP开发,使得开发者能够使用预定义的标签进行常见任务,如控制流程、数据处理和I/O操作,而无需编写大量...

    七年级英语暑假专题:名词同步练习.doc

    14. "stander-by" 指旁观者,复数形式为"standers-by",但在名词所有格形式下,"standers-by's" 关于事故的调查。但题目中没有给出所有格形式,故直接使用"standers-by"。正确答案是A. standers-by。 通过这些练习...

    Disig Web Signer 1.0.7-crx插件

    语言:slovenský ... 它不包含snig Web Stander - 您需要从单独的安装包中安装。 Disig Web签名者旨在签署Web门户环境中的电子签名保证的文档。 例如,应用程序可以在门户网站https://zep.disig.sk/ 上使用

    电子产品结构设计-1.pdf

    - DVD STANDER:DVD支架,用于固定DVD播放器或其他光盘驱动器的部分。 - ESD:静电放电,对于电子产品来说,静电放电的防护非常关键,以避免电路因静电而损坏。 - PAPER HOLDER:纸张夹具,可能是指产品设计中用于...

    NOT-2018-revised.rar_matlab 神经网络

    stander programming for the matlab which is very seful to find the exact result

    standard1.0jar包

    3. **JSTL**:JavaServer Pages Standard Tag Library(JSTL)提供了一组标签库,简化了在JSP页面中处理常见任务,如循环、条件判断、国际化等。 4. **EL**:Expression Language(EL)允许在JSP页面中通过简洁的...

    Coding Standard

    《Java编程规范详解》 在软件开发领域,代码质量至关重要,而编码规范是保障代码质量的重要基石。本文将深入探讨Java编程规范,并结合提供的资源,如`Java Coding Standard.doc`,以及配置文件`iisi-Formatter.xml`...

    unity3d的shader源码

    Unity3D是一款强大的跨平台游戏开发引擎,广泛用于创建3D和2D游戏、互动体验以及可视化应用。Shader是Unity3D中一个至关重要的部分,它控制着游戏对象的渲染效果,如颜色、光照、纹理等。源码的学习对于深入理解...

    lsopt_51_manual.pdf

    该文档提及了多名博士,例如Nielen Stander博士、Willem Roux博士、Anirban Basudhar博士、Trent Eggleston博士、Tushar Goel博士和Ken Craig博士,他们在2014年6月共同编写了这份手册。手册中不仅包含了产品介绍和...

    兰大《大学英语(3)》20春平时作业2答卷.docx

    7. **名词复数**:"stander-by"是旁观者的单数形式,复数为"standers-by"。所以正确答案是D."standers-by"。 8. **代词指代**:"it"在此处指代"A fitting our actions to those of other people appropriately",即...

    vmware vSphere5.0标准版、企业版、企业增强版

    ### VMware vSphere 5.0 版本差异详解 #### 一、概述 VMware vSphere 5.0 是一款引领虚拟化领域的旗舰产品,它提供了三种不同的版本以满足不同规模企业的多样化需求:标准版(Standard)、企业版(Enterprise)和企业...

    DriveES_调试软件的简易使用指南

    - **随SIMATIC STEP7一起安装**:如果已经安装了STEP7,则可以选择STANDER模式来安装DriveES Basic作为其附件。 - **单独安装**(未安装STEP7的情况下):可以选择STANDERALONE模式进行单独安装。 安装DriveES ...

Global site tag (gtag.js) - Google Analytics