1、BOOST_AUTO

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

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

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

2、typeid

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

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

int n = ;
cout << typeid(n).name() << endl;
cout << typeid(&n).name() << endl; cout << typeid(double).name() << endl; Base base;
Base * pBase = new Derived;
cout << typeid(base).name() << endl; //输出class Base
cout << typeid(pBase).name() << endl; //输出class Base*
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"。

#include <vector>
#include <boost/typeof/typeof.hpp>
int main()
{
BOOST_TYPEOF() x = ; //x为int类型,初始值为10
int n = ;
BOOST_TYPEOF(n) y = ; //y为int类型,初始值为0
BOOST_TYPEOF(&n) p = NULL; //p为int*类型,初始值为NULL
double d = 2.0;
BOOST_TYPEOF(n + d) pi = 3.14; //pi为double类型,初始值为3.14 return ;
}

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

    int n = ;
typeof(n) var = ; //var为int类型,初始值为666 int var = ;
typeof(&var) pVar = NULL; //pVar为int*类型,初始值为NULL typeof(var * n) value = ; //value为int类型,初始值为0

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

int main()
{
int n = ;
decltype(n) var = ; //var为int类型,初始值为0 int* pVar = NULL;
decltype(pVar) pNum = NULL; //pVar为int*类型,初始值为NULL int* pV = NULL;
decltype(*pV) Num; //error:*pV是左值类型,所以Num是一个引用,必须初始化 int FuncName();
decltype(FuncName()) value = ; //value为int类型,初始值为666 decltype(n * 3.0) pi = 3.14; //pi为double类型,初始值为3.14 return ;
}

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只能获得函数表达式的类型:

#include "boost/utility/result_of.hpp"

int main()
{
typedef double(*Func)(double d);
//Func func = sqrt;
boost::result_of<Func(double)>::type x = sqrt(5.0); return ;
}

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

#include "boost/utility/result_of.hpp"

typedef int(*FuncPtr)(int d);
typename boost::result_of<FuncPtr(int)>::type Func(FuncPtr t, int t1) //这里在result_of<>前必须加typename,否则编译出错
{
return t(t1);
} int main()
{
typedef int(*FuncPtr)(int d);
FuncPtr func = abs;
Func(func, -); return ;
}

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

#include "boost/utility/result_of.hpp"

template<typename T, typename T1>
typename boost::result_of<T(T1)>::type Func(T t, T1 t1) //这里在result_of<>前必须加typename,否则编译出错
{
return t(t1);
} int main()
{
typedef int(*FuncPtr)(int d);
FuncPtr func = abs;
Func(func, -); return ;
}

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. Linux编译命令-pthread & -lpthread

    编译makefile的时候到make编译连接阶段总是提示,无法打开某某库或者某某库的格式不对(1 先看看32位,64位是否对应:BITS,cflags lflags....,2 是否将.OS .a等依 ...

  2. MVC 的那点小事

    两年未见 一切从头再来.我猜到了故事的开头,找工作一如我想象的那般艰难,但是结果却比我预期的要好很多. 第一次开始用MVC 框架,比我想象的要简单的多,就像同事跟我说的,这只是个框架. 言归正传,前两 ...

  3. ABAP开发需要养成的习惯—处理规范,日期,sort,改结构

    sELECT select之后不要急着处理,最多用下sort还有delete adjacent,不用sy-subrc判断之后loop操作,要注意处理逻辑. sort一个好处是为了后面read tabl ...

  4. PowerDesigner生成数据字典

    1.首先说明我使用的环境 2.打开PDM模型,右键-->NEW-->REPORT 3.数据字典编辑器(一些通用模型吧,自己可以再DIY) 4.选择Table-->List of Ta ...

  5. oracle 数据库密码过期

    查询密码过期策略 SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIM ...

  6. admin 的流程 Xadmin

    提交根评论 显示根评论 --- render显示 --- ajax显示 提交子评论 显示子评论 ---- render显示 ---- Ajax显示(扩展) 评论树 博客:富文本编辑器 beautful ...

  7. PopupWindow与Edittext结合使用所遇到的坑

    PopupWindow与Edittext结合使用一起实现目的:既可以编辑输入想要的内容,还可以通过下拉列表来实现内容的选择. 我就是这样的一个目的,结果很简单的目的却遇到了很大的坑,下面我将把我遇到的 ...

  8. opencv和openGL的关系

    OpenCV是 Open Source Computer Vision Library OpenGL是 Open Graphics Library OpenCV主要是提供图像处理和视频处理的基础算法库 ...

  9. UEFI、BIOS、Secure Boot的关系和知识介绍

      从Windows 8操作系统时代开始,安装操作系统的方法也有了很大的改变,Windows 8采用了Secure Boot引导启动的方式,而不是过去Win XP和Win 7的Legacy启动方式,从 ...

  10. The prefix "mvc" for element "mvc:annotation-driven" is not bound 异常

    https://www.cnblogs.com/maodot/p/7531042.html The prefix "mvc" for element "mvc:annot ...