/* boost_typeof.cpp
boost中typeof库学习使用
*/
#include <iostream>
#include <vector>
#include <string>
#include <boost/typeof/typeof.hpp>
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
#define auto_t BOOST_AUTO
using namespace std;
using namespace boost;
//C++是一种静态强类型语言,所有变量在使用前都必须声明其类型
//但有时会带来麻烦,尤其是C++引入命名空间后,会导致繁琐的类型声明
//如 std::map<std::string, std::string>::iterator pos = ...;
//仅仅声明一个遍历map的迭代器,就使用了一大行
//使用using关键字打开命名空间后可以部分减少类型声明的长度,但是没有从根本是解决这样的问题
//随着编程技术的进步,将来的程序员也不可能写出冗长复杂的类型声明
//C++静态强类型的优点在这时已经成为阻碍程序员生产力的“缺陷”
//于是,C++11新增typeof和auto关键字解决上述问题
//头文件<boost/typeof/typeof.hpp> 定义的宏BOOST_TYPEOF BOOST_AUTO
//完全模拟了C++11中typeof和auto的用法
//boost::typeof虽然支持C++和STL的大部分数据类型,但是它并没有智能到支持任何数据类型
//如果用户自定义类型想应用于type库,则需要宏注册后才能使用
vector<string> vecFunc()
{
vector<string> vecString();
return vecString;
}
namespace ex
{
struct demo_class
{
int na;
int nb;
};
}
BOOST_TYPEOF_REGISTER_TYPE(ex::demo_class) //向typeof注册类
int main(void)
{
BOOST_TYPEOF(; //推导类型为double
); //推导类型为int
, "Michael Jordan")); //推导类型为pair<int, const char*>
BOOST_AUTO(vec, vecFunc()); //推导类型为vector<string>
cout << typeid(x).name() << endl << endl;
cout << typeid(y).name() << endl << endl;;
cout << typeid(p).name() << endl << endl;;
cout << typeid(vec).name() << endl << endl;;
BOOST_AUTO(xx, make_pair("Demo", ex::demo_class()));
cout << typeid(xx).name() << endl << endl;;
auto_t(pd, ]); //推导类型为double*
cout << typeid(pd).name() << endl << endl;;
cin.get();
;
}