1、如果需要继承一个不可复制的父类,直接使用boost的noncopyable类,需要包含以下头文件;
#include <boost/utility.hpp> // 或者 #include <boost/noncopyable.hpp>
2、在C++11中,变量的类型可以采用decltype或者auto来声明,但是在boost中,可以采用typeof来声明,定义了二个宏:BOOST_TYPEOF 和 BOOST_AUTO,分别用于仿真C++11的decltype或者auto,使用typeof需要包含头文件#include<boost/typeof/typeof.hpp>。
#include <boost/typeof/typeof.hpp>
#include <iostream>
using namespace std;
void typeof_usage()
{
BOOST_TYPEOF(2+3) a = 2+3;
BOOST_AUTO(b, 1*3);
b = 5;
cout<< "a = " <<a <<",b = "<<b<<endl;
BOOST_AUTO(p, new int(10));
cout<<"*p = " <<*p <<endl;
delete p;
}
3、typeof库支持c++内置的基本类型和stl中的大多数类型,但是如果希望typeof库支持自己定义的类,需要注册一组宏
#include <boost/typeof/typeof.hpp>
#include <iostream>
using namespace std;
//typeof库支持c++内置的基本类型和stl中的大多数类型,但是如果希望typeof库支持自己定义的类,需要注册一组宏
#define BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
namespace ex{
struct demo_class{int a, b;};
}
BOOST_TYPEOF_REGISTER_TYPE(ex::demo_class) //向typeof库注册类
void test_self_difine_class()
{
BOOST_AUTO(x, make_pair("test", ex::demo_class()));
cout<<typeid(x).name()<<endl;
x.second.a = 1;
x.second.b = 2;
cout<<"x.second.a = " << x.second.a << ", x.second.b = " <<x.second.b<<endl;
}
输出:
struct std::pair<char const *,struct ex::demo_class>
x.second.a = 1, x.second.b = 2
请按任意键继续. . .
4、optinal 应用
#include <boost/optional.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using namespace boost;
void optional_simple_usage()
{
optional<int> op1;
optional<int> op2(boost::none);
assert(!op1);
assert(op1==op2);
cout<<boolalpha<< (op1.get_value_or(253) == 253)<<noboolalpha<<endl;
optional<string> ops("hello");
cout<<*ops<<endl;
//vector
vector<int> vi(10);
optional<vector<int>& > ovi(vi);
ovi->push_back(5);
cout<<ovi->size()<<endl;
ovi = none;
assert(!ovi);//wrong usage: cout<<ovi->size()<<endl;
}
调用optional(bool Condition, T v)
optional<double> calc(int x)
{
return optional<double> (x != 0 , 1.0/x);
}
void optional_complex_usage()
{
optional<double> d = calc(10);
cout<<"d = " <<*d<<endl;
}
5、assign的应用
#include <boost/assign.hpp>
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <stack>
#include <queue>
#include <deque>
using namespace std;
void assign_usage()
{
using namespace boost::assign;
//vector push_back
vector<int> vi;
vi+=1,2,3,4,5;
push_back(vi)(6)(7)(8)(9)(10);
push_back(vi),11,12,13,14,15;
//list
list<string> ls;
push_front(ls) ("aaa") ("bbb") ("ccc");
//set-insert
set<string> ss;
ss+="aaa", "bbb", "ccc";
insert(ss) ("ddd") ("eee");
//map insert
map<int, string> mis;
mis+=make_pair(1,"aaa"), make_pair(2,"bbb");
//初始化容器使用函数list_of
vector<int> vilistof = list_of(1)(2)(3)(4)(5);
//重复输入
vector<int> vilistof_repeat = list_of(1).repeat(5,1);// 1,1,1,1,1
deque<string> ds = list_of("aaa")("bbb")("ccc");
set<int> si = (list_of(1),(2),(3));
//对于map需要单独使用pair_list_of或map_list_of
map<int, string> mislist = map_list_of(1,"aaa")(2, "bbb") (3,"ccc");
//转换为stack和queue
stack<int> stk = (list_of(1), 2, 3).to_adapter();
queue<string> qs = (list_of("aaa") ("xxxx") ("zzz")).to_adapter();
priority_queue<double> pqd = (list_of(1.11), 1.12, 1.3, 1.5).to_adapter();
//引用初始化列表
int a = 1, b =2 ,c = 3;
vector<int> v = ref_list_of<3>(a) (b) (c);
}
6、尽量使用boost::swap,它的效率比std::swap要高,提供了比std::swap更好的优化策略;使用方法有二种
公共测试类
class widget_swap{
public:
explicit widget_swap(int a = 0, int b = 0, int c = 0 ) : a_(a), b_(b), c_(c)
{
int x = 10;
}
void print(){
cout<<"a = " <<a_<<"b = "<<b_<<"c = "<<c_<<endl;
}
void swap(widget_swap& st)
{
std::swap(a_, st.a_);
std::swap(b_, st.b_);
std::swap(c_, st.c_);
cout<< "class inner swap"<<endl;
}
private:
int a_, b_, c_;
};
(1)特化std::swap模板
#include <boost/swap.hpp>
#include <iostream>
using namespace std;
namespace std{
<span style="white-space:pre"> </span>//特化std::swap函数
template<>
void swap(widget_swap& lhs, widget_swap& rhs){
lhs.swap(rhs);
}
}
void test_swap()
{
widget_swap a(1,2,3), b(4,5,6);
cout<<"std::swap"<<endl;
std::swap(a, b);
cout<<"boost::swap"<<endl;
boost::swap(a, b);//与上述std::swap等效
}
(2)定义一个全局函数swap
void swap(widget_swap& lhs, widget_swap& rhs){
lhs.swap(rhs);
}
void test_swap()
{
widget_swap a(1,2,3), b(4,5,6);
cout<<"std::swap"<<endl;
std::swap(a, b);//调用std::swap
cout<<"boost::swap"<<endl;
boost::swap(a, b);//调用boost::swap, boost::swap调用全局函数swap
}