1、BOOST_AUTO

BOOST_AUTO的功能类似于auto和any,可以用来定义任意类型数据,且可以在编译时自动推导出表达式的类型。BOOST_AUTO属于boost中的typeof库,使用需要包含"boost/typeof/typeof.hpp"。

当使用BOOST_AUTO用来定义引用类型的时候需要加&。

  1. #include <vector>
  2. #include <boost/typeof/typeof.hpp>
  3. int main()
  4. {
  5. BOOST_AUTO(x, ); //x为int类型,初始值为5
  6. int n = ;
  7. BOOST_AUTO(&i, n);//加了&表示引用,所以i为int&类型,初始值为10
  8. BOOST_AUTO(p, new char[]); //p为char*类型
  9. BOOST_AUTO(v, vector<int>(, )); //v为vector<int>类型,初始为包含10个值为0的元素
  10. BOOST_AUTO(ptr, &n); //ptr为int*类型,指向n
  11. BOOST_AUTO(y, n * ); //y为int类型,初始值为n * 5
  12.  
  13. return ;
  14. }

2、typeid

typeid是C++中的运算符关键字,使用它可以获得变量或表达式的类型,它返回的是type_info类型的对象,type_info类的成员函数name()用来获得具体类型的字符串,还支持==、!=判断。

如果测试的对象是类类型且至少包含有一个虚函数,则typeid是在运行时获得对象的类型,属于运行时类型识别RTTI。否则,typeid在编译时就可以计算出对象的类型。

  1. int n = ;
  2. cout << typeid(n).name() << endl;
  3. cout << typeid(&n).name() << endl;
  4.  
  5. cout << typeid(double).name() << endl;
  6.  
  7. Base base;
  8. Base * pBase = new Derived;
  9. cout << typeid(base).name() << endl; //输出class Base
  10. cout << typeid(pBase).name() << endl; //输出class Base*
  11. cout << typeid(*pBase).name() << endl; //输出class Derived

3、BOOST_TYPEOF、typeof、decltype

我们一般使用BOOST_AUTO、auto、any来直接定义变量,变量的数据类型在编译的时候通过保存的数据来导出;使用BOOST_TYPEOF、typeof、decltype也用来直接定义变量,但变量的数据类型根据指定变量或表达式的数据类型来导出。

①、BOOST_TYPEOF属于boost中的typeof库,使用需要包含"boost/typeof/typeof.hpp"。

  1. #include <vector>
  2. #include <boost/typeof/typeof.hpp>
  3. int main()
  4. {
  5. BOOST_TYPEOF() x = ; //x为int类型,初始值为10
  6. int n = ;
  7. BOOST_TYPEOF(n) y = ; //y为int类型,初始值为0
  8. BOOST_TYPEOF(&n) p = NULL; //p为int*类型,初始值为NULL
  9. double d = 2.0;
  10. BOOST_TYPEOF(n + d) pi = 3.14; //pi为double类型,初始值为3.14
  11.  
  12. return ;
  13. }

②、typeof是GUN C中的关键字。

  1. int n = ;
  2. typeof(n) var = ; //var为int类型,初始值为666
  3.  
  4. int var = ;
  5. typeof(&var) pVar = NULL; //pVar为int*类型,初始值为NULL
  6.  
  7. typeof(var * n) value = ; //value为int类型,初始值为0

③、decltype是c++11中的关键字,如果表达式是左值类型的,则返回的是对应的引用类型。

  1. int main()
  2. {
  3. int n = ;
  4. decltype(n) var = ; //var为int类型,初始值为0
  5.  
  6. int* pVar = NULL;
  7. decltype(pVar) pNum = NULL; //pVar为int*类型,初始值为NULL
  8.  
  9. int* pV = NULL;
  10. decltype(*pV) Num; //error:*pV是左值类型,所以Num是一个引用,必须初始化
  11.  
  12. int FuncName();
  13. decltype(FuncName()) value = ; //value为int类型,初始值为666
  14.  
  15. decltype(n * 3.0) pi = 3.14; //pi为double类型,初始值为3.14
  16.  
  17. return ;
  18. }

4、result_of

result_of<>可以获得一个调用表达式的返回类型,调用表达式是一个含有operator()的表达式,它可以是一个函数指针、函数引用、函数对象。

可以通过result_of<>的内部类型定义type来获得具体类型,假设类型Func可被调用(具有operator()),func是Func类型的一个左值,那么typeid(boost::result_of<Func(T1, T2, ...)>::type) 必然等于typeid(func(t1, t2, ...))。

c++11现在已经支持result_of。

①、result_of<>可以获得函数指针的类型,而typeof只能获得函数表达式的类型:

  1. #include "boost/utility/result_of.hpp"
  2.  
  3. int main()
  4. {
  5. typedef double(*Func)(double d);
  6. //Func func = sqrt;
  7. boost::result_of<Func(double)>::type x = sqrt(5.0);
  8.  
  9. return ;
  10. }

②、result_of<>获得函数调用表达式的类型:

  1. #include "boost/utility/result_of.hpp"
  2.  
  3. typedef int(*FuncPtr)(int d);
  4. typename boost::result_of<FuncPtr(int)>::type Func(FuncPtr t, int t1) //这里在result_of<>前必须加typename,否则编译出错
  5. {
  6. return t(t1);
  7. }
  8.  
  9. int main()
  10. {
  11. typedef int(*FuncPtr)(int d);
  12. FuncPtr func = abs;
  13. Func(func, -);
  14.  
  15. return ;
  16. }

③、result_of<>还可以获得泛型函数调用表达式的类型:

  1. #include "boost/utility/result_of.hpp"
  2.  
  3. template<typename T, typename T1>
  4. typename boost::result_of<T(T1)>::type Func(T t, T1 t1) //这里在result_of<>前必须加typename,否则编译出错
  5. {
  6. return t(t1);
  7. }
  8.  
  9. int main()
  10. {
  11. typedef int(*FuncPtr)(int d);
  12. FuncPtr func = abs;
  13. Func(func, -);
  14.  
  15. return ;
  16. }

boost--BOOST_AUTO、typeof、result_of的更多相关文章

  1. 原生JS:delete、in、typeof、instanceof、void详解

    delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/doc ...

  2. indexOf、instanceOf、typeOf、valueOf详解

    1.indexOf() 该方法用来返回某个指定的字符串值在字符串中首次出现的位置. 语法:indexOf(searchvalue,fromindex);两个参数,参数一表示查询的字符串值,参数二可选表 ...

  3. this 、typeof、false、parseInt()、this、arguments、Array和object判断

    typeof typeof (undefined) 不会报错 undefined object Number boolean function String 返回值为字符串类型 false .fals ...

  4. null、undefined、typeof、instanceof

    目录 概述 null undefined typeof instanceof 概述 JavaScript(ECMAScript标准)里共有5种基本类型: undefined, null, Boolea ...

  5. JS isArray、typeof、instanceof

    Array.isArray() 用来检验是不是数组 var a = [1,2,3] console.log(typeof a); // object console.log(Array.isArray ...

  6. (四)JavaScript之[break和continue]与[typeof、null、undefined]

    7].break和continue /** * JavaScript 的break和continue语句 * break 跳出switch()语句 * break 用于跳出循环 * continue ...

  7. R语言︱基本函数、统计量、常用操作函数

    先言:R语言常用界面操作 帮助:help(nnet) = ?nnet =??nnet 清除命令框中所有显示内容:Ctrl+L 清除R空间中内存变量:rm(list=ls()).gc() 获取或者设置当 ...

  8. 挑战:万能的slash! 判断js中“/”是正则、除号、注释?

    很久以前在其它地方就探讨和关注过这个问题,但都没有满意的解答. 看了zjfeihu 的帖子: <前端代码加亮插件(html,jss,css),支持即时加亮,运行代码>,再次提出这个比较经典 ...

  9. JavaScript中typeof、toString、instanceof、constructor与in

    JavaScript 是一种弱类型或者说动态语言.这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定. 这也意味着你可以使用同一个变量保存不同类型的数据. 最新的 ECMAScrip ...

随机推荐

  1. Unicode编码字符范围和具体文字

    1)标准CJK文字 http://www.unicode.org/Public/UNIDATA/Unihan.html 2)全角ASCII.全角中英文标点.半宽片假名.半宽平假名.半宽韩文字母:FF0 ...

  2. SPSS SAS 是什么?

    SPSS(Statistical Product and Service Solutions),“统计产品与服务解决方案”软件.最初软件全称为“社会科学统计软件包”(SolutionsStatisti ...

  3. Python中操作SQLAlchemy

    一.ORM 框架简介 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法 ...

  4. Web.config Transformation Syntax for Web Application Project Deployment

    Web.config Transformation Syntax for Web Application Project Deployment Other Versions   Updated: Ma ...

  5. c语言练习题:求1-1/2+1/3-1/4+... -1/100的值

    /******************************************* 求1-1/2+1/3-1/4+... -1/100的值 *************************** ...

  6. three.map.control

    网址:https://github.com/anvaka/three.map.control 在threejs群里发现的一个很有意思的问题之前没有接触过: 存在的问题:  我在微信小游戏中,用orbi ...

  7. MYSLQ数据库 day 1

    啥是SQL? 据库的组成部分,其中数据库管理系统可以接收一些命令,对数据文件进行添加.删除.修改.查询等操作.那么这些命令就是 SQL . SQL:(Structured Query Language ...

  8. React-router4 第二篇url-params url参数

    官方文档 以下代码均来自于官方文档 上来一步走 import React from 'react' import { BrowserRouter as Router, Route, Link } fr ...

  9. hdu 1257 && hdu 1789(简单DP或贪心)

    第一题;http://acm.hdu.edu.cn/showproblem.php?pid=1257 贪心与dp傻傻分不清楚,把每一个系统的最小值存起来比较 #include<cstdio> ...

  10. VisualStudio使用技巧

    控制台工程去除黑框 刚学习OpenGL,绘制图形的时候,如果不进行设置,运行的时候会先出现黑窗口再出现Windows窗口.其实要去除控制台窗口非常简单,只需要修改工程设置,把子系统改成Windows, ...