学习boost typeof

本文详细介绍了c++中typeof和auto关键字的使用动机、原理及其实现方式,通过typeof库来简化繁琐的类型声明,特别针对c++语言内建类型、标准库中的容器类型进行了实例演示,并解释了如何向typeof库注册自定义类。同时,展示了typeof库在模板类型自动推导方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、typeof 功能:

typeof库使用宏模拟了c++0x新增加的typeof和auto关键字,可以减轻书写烦琐的变量类型声明的工作,简化代码。

2、包含头文件:#include<boost/typeof/typeof.hpp>

3、动机:

c++是一种静态强类型语言,所有变量在使用前都必须声明其类型,这使得c++具有运行速度快,代码规范等很多优点,但有的时候,这个优点却是麻烦的来源--尤其是c++引入名字空间特性会导致烦琐的类型声明。考虑如下

(1)stl迭代器的声明: std::map<std::string, std::string>::iterator pos = ...;
仅仅声明一个用于遍历map容器的迭代器,变量名不过三个字符,而类型声明却长达44个字符,是变量名的十多倍。

(2)使用boost库

#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/shared_ptr.hpp>
boost::shared_ptr<boost::gregorian::date> pd = ...;

鉴于此,c++标准委员会考虑在新标准中增加关键字typeof,重新定义来自c语言的auto关键字以解决上述问题。

4、(1)使用typeof关键字,可以让c++编译器在编译时自动推导表达式的类型

typeof(...) pos = ...;
typeof(...) pd = ...;
(2)使用auto关键字则进一步简化写法:
auto pos = ...;
auto pd = ...;
但是在c++0x真正到来之前,我们还不得不使用烦琐的声明语法,为此typeof提供了使用库的解决方案,无论编译器是否支持新的typeof或者auto关键字,它都可以正常工作。

5、BOOST_TYPEOF和BOOST_AUTO:

头文件<boost/typeof.hpp>里定义了两个宏:BOOST_TYPEOF和BOOST_AUTO,分别用于仿真c++新标准的typeof和auto关键字,可以在编译器自动推导表达式的类型。它们不仅能够推导c++语言内建的int,double,数组,函数指针等等类型,也支持标准库中的容器类型。这两个宏完全模仿了typeof和auto关键字的用法,除了因为宏的语法限制而不得不使用逗号分隔参数,宏的简要声明如下:

(1)BOOST_TYPEOF

#define BOOST_TYPEOF(Expr) \ boost::type_of::decode_begin<BOOST_TYPEOF_ENCODED_VEVROT(Expr)>::type

BOOST_TYPEOF使用一个表达式作为宏的参数,它可以如typeof那样推导出表达式Expr的类型。

(2)BOOST_AUTO
#define BOOST_AUTO(Var, Expr) BOOST_TYPEOF(Expr) Var = Expr;
BOOST_AUTO的功能则与auto类似,使用BOOST_TYPEOF推导表达式Expr类型,然后用这个类型声明变量Var,并将表达式的结果赋值给Var,由于BOOST_AUTO实际上调用了BOOST_TYPEOF,因此它不仅能够声明普通变量,也能够在变量名前加上&或者*修饰,声明引用或者指针变量。

(3)BOOST_TYPEOF和BOOST_AUTO用法的示范代码如下:
#include <boost/typeof/typeof.hpp>
using namespace boost;
using namespace std;
vector<string> func() //一个返回vector<string>的函数
{
vector<string> v(10);
  return v;
}
int main()
{
   BOOST_TYPEOF(2.0 * 3)  x = 2.0*3;  //推导类型为double
   BOOST_AUTO(y, 2+3);                        //推导类型为int
   BOOST_AUTO(&a, new double[20]); //推导类型为double*的引用
   BOOST_AUTO(p, make_pair(1, "string"));//推导类型为pair<int, const char*>
   BOOST_AUTO(v, func());      //推导类型为vector<string>
   return 0;
}

6、向typeof库注册自定义类

要向typeof库注册类型,首先需要加如下语句开始:#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()

然后后的注册类使用宏BOOST_TYPEOF_REGISTER_TYPE,它必须在全局名字空间使用,宏的参数是类型的完全名称,包括名字空间限定
实例:
#include <boost/typeof/typeof.hpp>
using namespace boost;
using namespace std;
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace ex
{
 struct demo_class{int a,b;};
}
BOOST_TYPEOF_REGISTER_TYPE(ex::demo_class) //向typeof库注册类
int main()
{
  BOOST_AUTO(x, make_pair("text", ex::demo_class()));
  cout<< typeid(x).name()<<endl;
x.second.a = 10;
  x.second.b = 20;
cout<< x.second.a << x.second.b <<endl;
return 0;
}

模板类型自动推导 

typeof库不仅能够推导一般表达式的类型,也能够推导带有模板的复杂表达式,在模板语境中时需要使用BOOST_TYPEOF_TPL和BOOST_AUTO_TPL.

转载自:http://blog.youkuaiyun.com/mmzsyx/article/details/8153863


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值