现在的位置: 首页 > 综合 > 正文

Boost实用工具

2014年01月04日 ⁄ 综合 ⁄ 共 2205字 ⁄ 字号 评论关闭

      boost中有很多小的工具,虽然很小,但是很实用。下面简单介绍一下这几个工具。

      第一个:noncopyable,从名字可以看出来,它实现一个禁止复制的类,原理也比较简单,就是把一个类的拷贝构造函数和赋值操作符私有化,我们的类在继承这个类就行了。原理比较简单,就不贴源代码了,直接上例子。

比如我们定义一个类:class my_class:boost::noncopyable{...};

m_class a;

m_class a(b);//出错,不允许赋值

m_class c=a;//出错

因为拷贝构造函数和赋值操作符都是私有的,不能被访问,这样的操作会编译出错,这样就禁止了类的复制。

    第二个:typeof,在MFC中曾经实现了这样一个功能,在boost中原理和MFC中很相似。都是定义一个宏,使用宏在编译期推导表达式的类型。

这个宏的简要声明如下,#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_TYPEOF(2*0.3) x = 5*7.8;//推导类型double
    cout<<x<<endl;

    BOOST_AUTO(&a,new double[20]);//推导类型为double的引用,并声明变量a
    BOOST_AUTO(p,make_pair(1,"string"));//推导类型为pair<int,const char*>

但是请注意,typeof支持C++内置基本类型和STL大部分类型,但是他并不能支持所有的类型,如果想让他支持我们自定义的类型我们得先进行注册,及告诉typeof类型库里面有这个类。

注册的方法:BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP(),BOOST_TYPEOF_REGISTER_TYPE用法如下:

#include <boost\typeof\typeof.hpp>
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
using namespace std;
namespace ex
{
	struct demo{int a;int b;};
}
BOOST_TYPEOF_REGISTER_TYPE(ex::demo);
int main()
{
	BOOST_AUTO(x,make_pair("test",ex::demo()));
	cout<<typeid(x).name()<<endl; //typeid用于获知一个变量的具体类型

	x.second.a = 20;//20
	cout<<x.second.a<<endl;
	return 0;
}


第三个:assign,许多情况下我们需要给容器初始化或者赋值,填入大量的数据,在STL里面需要调用insert()或者push_back()还需要加上循环比较麻烦,所以boost.assign应运而生。

使用示例1:使用+=向容器增加元素

使用使用assign必须使用using指示符,这样才能让重载的+=在作用域生效。

#include <iostream>
#include <set>
#include <string>
#include <boost\assign.hpp>
using namespace std;
int main()
{
	using namespace boost::assign;
	vector<int> v;
	v += 1,2,3,4,5;
	set<string> s;
	s += "char","string","test";
	map<int,string> m;
	m += make_pair(1,"aa"),make_pair(2,"bb");
	cout<<m[1]<<endl;//打印aa
	return 0;
}

使用示例2:使用()王容器增加元素

#include <iostream>
#include <set>
#include <string>
#include <list>
#include <boost\assign.hpp>
using namespace std;
int main()
{
	using namespace boost::assign;
	vector<int> v;
	push_back(v) (1) (2) (3) (4) (4*5);
	cout<<v[3]<<endl;//4
	list<string> str;
	push_front(str) ("aa") ("string") ("cpp");
	cout<<str.front()<<endl;//cpp
	map<int,string>  m;
	insert(m) (1,"test") (2,"char*") (3,"cpp");
	cout<<m[1]<<endl;//test
	return 0;
}

使用示例3:初始化容器元素

有的时候我们需要在容器构造的时候就完成数据的填充,这这时我们就用到了list_of(),map_list_of()/pair_list_of()还有tuple_list_of来解决这个问题。



【上篇】
【下篇】

抱歉!评论已关闭.