boost库 typeof 实用工具学习

typeof

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

1
#include <boost/typeof/typeof.hpp>

动机

C++是静态强类型语言,所有变量在使用前必须声明类型,让C++具有运行速度快,代码规范等很多优点,但在引入名词空间特性后会导致烦琐的类型声明。
C++0x中typeof/auto关键字,可以让C++编译器在运行时自动推导表达式的类型。

用法

头文件中定义的两个宏:BOOST_TYPEOF和BOOST_AUTO,分别仿真C++新标准的typeof和auto关键字,在编译器自动推导表达式类型,不仅能够推导C++语言内建类型,也支持标准库中的容器类型。BOOST_TYPEOF和BOOST_AUTO完全模仿typeof和auto关键词。

宏的简要声明如下:

1
2
3
#define BOOST_TYPEOF(Expr)\
boost::type_of::decode_begin<BOOST_TYPEOF_ENCODED_VECTOR(Expr) >::type
#define BOOST_AUTO(Var, Expr) BOOST_TYPEOF(Expr) Var = Expr

BOOST_TYPEOF使用一个表达式作为宏的参数,推导Expr的类型。BOOST_AUTO实际调用BOOST_TYPEOF,因此BOOST_AUTO不仅可以声明普通变量,也可以在变量名前加&或者*修饰,声明引用或者指针变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//typeof
void TestTypeof()
{
//typeof(1) tint = 1;
//typeof(1>0) tbool = 1>0;

auto tint1 = 1;
auto tbool1 = 1>0;
cout<<tint1<<endl;
cout<<tbool1<<endl;

BOOST_TYPEOF(1) tint2 = 1;
BOOST_TYPEOF(3.14) tdouble2 = 3.14;
cout<<tint2<<endl;
cout<<tdouble2<<endl;

BOOST_AUTO(tdp, new double[20]);
BOOST_AUTO(tpair, make_pair(1, "string"));
cout<<tpair.second<<endl;

return ;
}

向typeof库注册自定义类

typeof库支持C++内建的基本类型和STL中的大多数类型,但并不能支持所有类型,如果用户自定义类向应用于typeof库,需要使用库提供的一组宏注册。
向typeof库注册类型,先使用以下语句开始 #include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP() 后面注册类型使用宏BOOST_TYPEOF_REGISTER_TYPE,必须在全局名字空间使用,宏的参数是类型的完全名称,包括名字空间限定。

高级议题

为BOOST_AUTO更名

BOOST_AUTO名字有点长,书写不便,可以用auto_t代替BOOST_AUTO

1
#define auto_t BOOST_AUTO

模版类型自动推导

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