boost--BOOST_AUTO、typeof、result_of
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的更多相关文章
- 原生JS:delete、in、typeof、instanceof、void详解
delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/doc ...
- indexOf、instanceOf、typeOf、valueOf详解
1.indexOf() 该方法用来返回某个指定的字符串值在字符串中首次出现的位置. 语法:indexOf(searchvalue,fromindex);两个参数,参数一表示查询的字符串值,参数二可选表 ...
- this 、typeof、false、parseInt()、this、arguments、Array和object判断
typeof typeof (undefined) 不会报错 undefined object Number boolean function String 返回值为字符串类型 false .fals ...
- null、undefined、typeof、instanceof
目录 概述 null undefined typeof instanceof 概述 JavaScript(ECMAScript标准)里共有5种基本类型: undefined, null, Boolea ...
- JS isArray、typeof、instanceof
Array.isArray() 用来检验是不是数组 var a = [1,2,3] console.log(typeof a); // object console.log(Array.isArray ...
- (四)JavaScript之[break和continue]与[typeof、null、undefined]
7].break和continue /** * JavaScript 的break和continue语句 * break 跳出switch()语句 * break 用于跳出循环 * continue ...
- R语言︱基本函数、统计量、常用操作函数
先言:R语言常用界面操作 帮助:help(nnet) = ?nnet =??nnet 清除命令框中所有显示内容:Ctrl+L 清除R空间中内存变量:rm(list=ls()).gc() 获取或者设置当 ...
- 挑战:万能的slash! 判断js中“/”是正则、除号、注释?
很久以前在其它地方就探讨和关注过这个问题,但都没有满意的解答. 看了zjfeihu 的帖子: <前端代码加亮插件(html,jss,css),支持即时加亮,运行代码>,再次提出这个比较经典 ...
- JavaScript中typeof、toString、instanceof、constructor与in
JavaScript 是一种弱类型或者说动态语言.这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定. 这也意味着你可以使用同一个变量保存不同类型的数据. 最新的 ECMAScrip ...
随机推荐
- 通过location对象的某些属性得到一个完整URL的各个部分。
I’m home. 我回来了. I’m lost. 我迷路了. This way. 这边请. After you. 您先. Bless you! 祝福你! 笔记: http://www.example ...
- HandlerMapping和HandlerAdapter配置须知
---------------------siwuxie095 HandlerMapping 和 HandlerAdapter 配置须知 ...
- mysql学习1:数据类型:数字型,日期和时间,字符串类型(总结)
mysql数据类型:数字型,日期和时间,字符串类型 摘要 MySQL中定义数据字段的类型对数据库的优化是非常重要的: MySQL支持多种类型,大致可以分为三类,如下. 数字类型 整数:tinyint. ...
- layui禁用侧边导航栏点击事件
layui是一款优秀的前端模块化css框架,作者是贤心 —— 国内的一位前端大佬. 我用layui做过两个完整的项目,对她的感觉就是,这货非常适合做后台管理界面,且基于jquery,很容易上手.当然, ...
- Soa思想分布式服务webservice WCF
什么是分布式事务 分布式事务就是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这 ...
- Git二进制文件冲突解决
Git二进制文件冲突解决 在我们合并分支的时候,如果两个分支都进行了修改那么就会产生合并冲突.对于非二进制文件的冲突解决,git会给出冲突的位置我们可以手动修改然后再commit.但是对于非二进制文件 ...
- 事件类型(js)
焦点事件:在页面获得或失去焦点时触发. 与document.hasFocus和document.activeElement属性配合,可以得到用户在页面的行踪. blur:元素失去焦点时触发.这个事件不 ...
- Nginx 的 docker 部署
1.输入命令 docker pull nginx:1.15 拉取 nginx 的镜像: 2.使用 docker images 查看拉取到的镜像信息: 3.在主机上创建用于映射的目录 mkdir -p ...
- linux通过python设置系统默认编码
import sys sys.reload() sys.getdefaultencoding() # 查看设置前系统默认编码 sys.setdefaultencoding('utf-8') sys.g ...
- Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
最近在Tomcat上配置一个项目,在点击一个按钮,下载一个文件的时候,老是会报上面的错误.试了很多方法,如对server.xml文件中,增加MaxHttpHeaderSize的大小,改端口,改Tomc ...