促进 C++库

……其中一个世界。 赫伯·萨特安德烈亚历山德雷斯库,C类++编码标准

这是旧版本Boost的文档。单击此处查看此页面的最新版本。

标题提升/实用性.hpp

标题的全部内容<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斜纹棉布后备可能的解决方案以便携性为代价的某些问题。对于例子:

此实现结果需要类模板部分专用化能够正确解析函数类型,并支持用于SFINAE。如果结果不支持由编译器执行,包括标题增压/效用/结果_of.hpp定义宏BOOST_NO_RESULT_OF(提升_结果_否).

有关更多信息关于结果,请参阅C++库技术报告,1836奈拉,或者,出于动机和设计原理,这个结果 建议.

boost::result_of的使用指南

以下是关于何时进行的一般建议以及如何使用增强::result_of.

  1. 如果您的目标是C++11,并且不关心关于非兼容编译器的可移植性或标准的早期版本,然后使用标准::结果.如果标准::结果满足您的需求,那么就没有理由停止使用它。
  2. 如果您的目标是C++11,但可能会移植您的代码在未来的某个时候,旧版编译器使用增强::result_of具有解密.何时解密习惯于增强::result_of标准::结果通常是可互换。请参阅上的文档已知差异在boost::result_of和C++11 result_of.之间。
  3. 如果需要编译器可移植性,使用增强::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协议的建议。

boost::result_of和TR1 result_off之间的已知差异

使用时解密,增强::result_of忽略TR1协议,而是推导直接返回函数对象的类型通过解密。在大多数情况下,用户不会注意到差异,只要他们使用协议正确。以下是中的情况根据类型推断通过增强::result_of已知的差异取决于是否解密或者TR1协议是已使用。

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网站