标题的全部内容<boost/utility.hpp>
在中命名空间增强
.
目录
类模板结果
有助于确定调用表达式。例如,给定左值(f)
属于类型F类
和左值t1时间
,t2时间
, ...,t吨N个
属于类型T1类
,T2段
, ...,T型N个
分别为类型结果≤F(T1、T2。。。,T型N个)>::类型
定义结果类型表达式的f(t1,t2,…,tN个)
.此实施允许类型F类
作为函数指针,函数引用、成员函数指针或类类型。默认情况下,N个可以是0到之间的任何值16.要更改上限,请定义宏BOOST_RESULT_OF_NUM_ARGS系统
达到最大值的值N个.类模板结果
驻留在标题中<增压/效用/结果_of.hpp>
.
如果编译器支持解密
是足够,结果
自动使用它来推导调用表达式的类型,在这种情况下结果≤F(T1、T2。。。,T型N个)>::类型
命名类型下降类型(增压::下降<F>()(增压:;下降<T1>(),升压::下降<T2>()。。。,增压::下降<TN个>()))
,如以下示例。
结构函子{模板<T类>T运算符()(T x){返回x;}};typedef增强::result_of<函子(int)>::type type;//类型为int
您可以测试结果
正在使用解密
通过检查宏BOOST_RESULT_OF_USE_DECLTYPE(BOOST_RESULT_OF_USE_DECLTYPE)
定义时间晚于包括hpp结果
。您还可以强制结果
使用解密
通过定义BOOST_结果_使用_分类类型
先前的到包括hpp结果
.
如果解密
未使用,然后函数的自动结果类型演绎对象是不可能的。相反,结果
使用以下协议允许程序员指定类型。什么时候?F类
是具有成员类型结果类型
,结果≤F(T1、T2。。。,T型N个)>::类型
是F: :结果类型
.何时F类
做不包含结果类型
,结果≤F(T1、T2。。。,T型N个)>::类型
是F: :结果<F(T1,T2。。。,T型N个)>::类型
什么时候N个> 0
或空隙
什么时候N个= 0
。请注意,它是程序员有责任确保函数对象准确地公布其结果通过该协议键入,如下所示例子。
结构函子{模板<class>结构体结果;模板<F类,T类>结构结果<F(T)>{typedef T型;};模板<T类>T运算符()(T x){返回x;}};typedef增强::result_of<函子(int)>::type type;//类型为int
自解密
是一种新语言最近在C++11中标准化的功能,如果您正在编写函数对象与一起使用结果
,用于最大限度地提高可移植性,您可以考虑以下几点即使编译器已经适当的解密
支持。如果您希望继续在编译器上使用协议支持解密
,有两个选项:你可以使用提升::tr1_result_of
,这也是定义于<增压/效用/结果_of.hpp>
.或者,您可以定义宏BOOST_RESULT_OF_USE_TR1启动结果
,这导致结果
使用描述的协议而不是解密
。如果您选择遵循协议,注意确保结果类型
和结果<>
成员准确无误表示的返回类型运算符()
给定调用表达式。
此外,增强::result_of
提供了第三种操作模式,一些用户可能会觉得很方便。什么时候?BOOST_RESULT_OF_USE_TR1_WITH_DECLTYPE_FALLBACK
定义,增强::result_of
表现为跟随。如果函数对象有成员类型结果类型
或成员模板结果<>
,然后增强::result_of
将使用TR1协议。否则,增强::result_of
将使用解密
。使用TR1一斜纹棉布
后备可能的解决方案以便携性为代价的某些问题。对于例子:
- 编译器缺陷:如果您的代码要求
增强::result_of
去工作返回类型不完整,但您的编译器的解密
实施不支持不完整的返回类型,那么您可以使用TR1协议作为解决方法。支持对于不完整的返回类型,在C++11标准化过程(请参见3276号)某些编译器没有实现。
- 遗留代码不足:如果您现有的TR1函数对象公布的类型与推导出的实际结果类型通过
解密
,然后将TR1与解密
回退将允许您使用现有的TR1函数对象和新的C++11函数对象。这种情况如果遗留函数对象误用了TR1协议。请参阅上的文档已知差异之间增强::result_of
和TR1。
此实现结果
需要类模板部分专用化能够正确解析函数类型,并支持用于SFINAE。如果结果
不支持由编译器执行,包括标题增压/效用/结果_of.hpp
将定义宏BOOST_NO_RESULT_OF(提升_结果_否)
.
有关更多信息关于结果
,请参阅C++库技术报告,1836奈拉,或者,出于动机和设计原理,这个结果
建议.
boost::result_of的使用指南
以下是关于何时进行的一般建议以及如何使用增强::result_of
.
- 如果您的目标是C++11,并且不关心关于非兼容编译器的可移植性或标准的早期版本,然后使用
标准::结果
.如果标准::结果
满足您的需求,那么就没有理由停止使用它。
- 如果您的目标是C++11,但可能会移植您的代码在未来的某个时候,旧版编译器使用
增强::result_of
具有解密
.何时解密
是习惯于增强::result_of
和标准::结果
通常是可互换。请参阅上的文档已知差异在boost::result_of和C++11 result_of.之间。
- 如果需要编译器可移植性,使用
增强::result_of
采用TR1协议。
不管你怎么做配置增强::result_of
,是的重要的是要记住函数可能会根据其参数发生变化,并且此外,成员函数的返回类型可能根据简历资格的变化对象。增强::result_of
必须通过适当的cv限定类型,以便推导出相应的返回类型。例如:
结构函子{整数&运算符()(int);int常量&operator()(int)常量;float&operator()(float&);浮点常量&operator()(浮点常量&);};typedef增强::result_of<函子(int)>::type type1;//type1为int&typedef增强::result_of<常数函子(int)>::type type2;//type2是int常量&typedef增强::result_of<函子(浮点&)>::type type3;//类型3是浮点型&typedef增强::result_of<函子(浮点常量&)>::类型type4;//类型4是浮点常量&
TR1 result_of协议的使用指南
在兼容的C++11上编译器,增强::result_of
可以使用解密
来推断任何调用表达式,包括对函数的调用物体。但是,在C++11之前的编译器或没有足够的decltype支持的编译器,功能上需要额外的脚手架对象。以下是关于如何使用TR1协议的建议。
- 当返回类型不依赖于参数类型或函数对象,简单地定义
结果类型
.没有必要使用结果
模板,除非返回类型不同。
- 定义时使用协议指定的类型功能原型。这有助于确保实际返回类型与不同步协议规范。例如:
结构函子{typedef int结果类型;result_type运算符()(int);};
- 始终指定
结果
相应的专业化运算符()
超载。这可以做到更容易使专业化与过载。例如:
结构函子{模板<类>结构结果;模板<F类>结构结果<F(int)>{typedef整数&type;};结果<functor(int)>::type operator()(int);模板<F类>结构结果<const F(int)>{typedef int常量&type;};结果<const functor(int)>::type operator()(int)const;};
- 使用类型转换简化这个
结果
模板专门化。对于例如,以下使用促进。类型特征专门化结果
的模板单人间运算符()
可以调用的常量和非静态函数对象左值或右值参数。
结构函子{模板<class>结构体结果;模板<F类,T类>结构结果<F(T)>:boost::remove_cv<typename boost::remove_reference<T>::type>{};模板<T类>T运算符()(T常量&x)常量;};
boost::result_of和TR1 result_off之间的已知差异
使用时解密
,增强::result_of
忽略TR1协议,而是推导直接返回函数对象的类型通过解密
。在大多数情况下,用户不会注意到差异,只要他们使用协议正确。以下是中的情况根据类型推断通过增强::result_of
已知的差异取决于是否解密
或者TR1协议是已使用。
- TR1协议滥用
使用TR1时协议,增强::result_of
不能检测对函数对象与指定的类型相同根据协议,允许指定的类型和实际类型。什么时候?使用解密
,这些微妙的错误可能会导致编译错误。例如:
结构函子{typedef short result_type;int运算符()(短);};#如果定义BOOST_RESULT_OF_USE_DECLTYPEBOOST_STATIC_ASSERT(启动_状态_设置)((boost::is_same<boost::result_of<functor(short)>::type,int>::value)); #其他升压_静态_断言((boost::is_same<boost::result_of<函数(short)>::类型,short>:值));#结尾
请注意,用户可以力增强::result_of
使用TR1协议,即使在平台上支持解密
通过定义BOOST_RESULT_OF_USE_TR1启动结果
.
- Nullary函数对象
使用TR1协议时,增强::result_of
无法始终将调用类型推断为nullary函数对象,在这种情况下类型默认为void。使用时解密
,增强::result_of
总是给出调用表达式。例如:
结构函子{模板<类>结构结果{typedef int类型;};int运算符()();};#如果定义BOOST_RESULT_OF_USE_DECLTYPEBOOST_STATIC_ASSERT(启动_状态_设置)((boost::is_same<boost::result_of<functor()>::type,int>::value));#其他BOOST_STATIC_ASSERT(启动_状态_设置)((boost::is_same<boost::result_of<functor()>::type,void>::value));#结尾
请注意,对于nullary函数问题。只要你回来类型不变,结果类型
总是可以用来指定返回类型而不考虑arity。如果返回类型确实不同,那么用户可以专门从事增强::result_of
自身用于无效呼叫。
- 非类prvalues和cv-qualification
使用TR1时协议,增强::result_of
将报告指定的cv合格类型通过结果类型
或这个结果
模板,无论呼叫的实际简历资格表达式。使用时解密
,增强::result_of
将报告调用表达式的实际类型,当表达式为非类prvalue。例如:
结构函子{模板<类>结构结果;模板<类F,类T>结构结果<F(常数T)>{typedef常量T类型;};const短运算符()(const短);int const&operator()(int const&);};//无论是否使用decltype,非prvalue调用表达式的工作原理都相同。BOOST_STATIC_ASSERT(启动_状态_设置)((增强::is_same<boost::result_of<函数(int const&)>::类型,int常量&::value));//非类prvalue调用表达式实际上不是cv限定的,//但只有基于decltype的结果准确地报告了这一点。#如果定义BOOST_RESULT_OF_USE_DECLTYPEBOOST_STATIC_ASSERT(启动_状态_设置)((增强::is_same<boost::result_of<函数(const short)>::类型,短的::value));#其他BOOST_STATIC_ASSERT(启动_状态_设置)((增强::is_same<boost::result_of<函数(const short)>::类型,常量短::value));#结尾
boost::result_of和C++11 result_off之间的已知差异
使用时解密
,增强::result_of
实现了大多数C++11 result_of规范。一个已知的例外是增强::result_of
不实现关于指向成员数据的指针的要求。
由Doug Gregor创建。Daniel Walker、Eric Niebler、Michel Morin等人的贡献
宏BOOST_BINARY
宏BOOST_BINARY公司
用于二进制文字的表示。它作为一个论点一个二进制数,在长度为1至8的分组,分组分开按空格。生成的文本类型由与十六进制和八进制的规则相同文字(第2.13.1页). 通过实现,此宏在预处理期间直接扩展为八进制文字,因此在运行时没有开销,结果可以用于八进制文字的任何位置。
为了直接支持带后缀的二进制文字,BOOST_BINARY_XXX形式的其他宏也包括提供,其中XXX是所有大写字母中的标准整数后缀信件。此外,LL和ULL后缀可用于表示编译器中的long-long和unsigned-long-long类型提供了作为扩展。
BOOST_BINARY宏系列位于标题中<boost/utility/binary.hpp>自动包含在<boost/utility.hpp>.
马特·卡拉布雷斯撰稿。
例子
无效foo(int);void foo(unsigned long);空心棒(){int value1=BOOST_BINARY(100 111000 01 1 110);无符号长值2=BOOST_BINARY_UL(100 001);//无符号长长长值3=BOOST_BINARY_LL(11 000);//long-long(如果支持)断言(BOOST_BINARY(10010)&助推二进制(11000)==BOOST_BINARY(10000));foo(BOOST_BINARY(1010));//调用第一个foofoo(BOOST_BINARY_LU(1010));//调用第二个foo}
修订2008年9月4日
©Beman Dawes版权所有1999-2003。
根据Boost软件许可证1.0版进行分发。请参见www.boost.org/LICENSE_1_0.txt网站