boost typeof

来源:互联网 发布:淘宝首页装修视频教程 编辑:程序博客网 时间:2024/04/30 00:44

typeof:
 typeof库使用宏模拟了c++0x新增加的typeof和auto关键字,可以减轻书写烦琐的变量类型声明的工作,简化代码
包含头文件:
#include<boost/typeof/typeof.hpp>

动机:
c++是一种静态强类型语言,所有变量在使用前都必须声明其类型,这使得c++具有运行速度快,代码规范等很多优点,但有的时候,这个优点却是麻烦的来源--尤其是c++引入名字空间特性胡--会导致烦琐的类型声明。
考虑如下stl迭代器的声明:
std::map<std::string, std::string>::iterator pos = ...;
仅仅声明一个用于遍历map容器的迭代器,变量名不过三个字符,而类型声明却长达44个字符,是变量名的十多倍。

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

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

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

用法:
 头文件<boost/typeof.hpp>里定义了两个宏:BOOST_TYPEOF和BOOST_AUTO,分别用于仿真c++新标准的typeof和auto关键字,可以在编译器自动推导表达式的类型。它们不仅能够推导c++语言内建的int,double,数组,函数指针等等类型,也支持标准库中的容器类型。
 这两个宏完全模仿了typeof和auto关键字的用法,除了因为宏的语法限制而不得不使用逗号分隔参数,宏的简要声明如下:
#define BOOST_TYPEOF(Expr) \
 boost::type_of::decode_begin<BOOST_TYPEOF_ENCODED_VEVROT(Expr)>::type
#define BOOST_AUTO(Var, Expr) BOOST_TYPEOF(Expr) Var = Expr;
BOOST_TYPEOF使用一个表达式作为宏的参数,它可以如typeof那样推导出表达式Expr的类型。BOOST_AUTO的功能则与auto类似,使用BOOST_TYPEOF推导表达式Expr类型,然后用这个类型声明变量Var,并将表达式的结果赋值给Var,由于BOOST_AUTO实际上调用了BOOST_TYPEOF,因此它不仅能够声明普通变量,也能够在变量名前加上&或者*修饰,声明引用或者指针变量。

示范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;
}

向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.