boost-实用工具:noncopyable、optional、assign
1、noncopyable
让一个类从noncopyable继承可以实现禁止对象的复制,使用需要包含头文件"boost/noncopyable.hpp"或"boost/utility.hpp"。noncopyable实际上是将类的拷贝构造函数和赋值操作符声明为了private来实现禁止对象的赋值。
#include "boost/utility.hpp" class CMyClass:public boost::noncopyable
{ };
int main()
{
CMyClass a, b;
a = b; //error
CMyClass c(a); //error return ;
}
2、optional
optional类可以表示一个无意义的值,比如以下代码,我们使用get_optional()查找xml上的一个节点,如果该节点不存在的话就会返回一个无效的optional对象,此时对象就是空的。
ptree pt;
read_xml("conf.xml", pt); boost::optional<int> op = pt.get_optional<int>("conf.gui");
if (op)//节点不存在则op为空
{
int i = op.get();
}
成员函数:
无参数或参数为boost::none的构造函数用来构造一个无效的对象。
如果构造函数中的参数是一个值的引用的话,那么optional中元素其实也是这个值的引用。
get()可以获得元素的引用,get_value_or()也可以获得元素的引用,如果对象是无效的话get_value_or()还可以设置一个默认的返回值,get_ptr()可以获得元素的指针。
提供了隐式bool类型转换以判断对象的有效性。
重载了operator*和operator->,*运算可以获得元素的值,->操作可以获得元素的指针。
支持==、!=、>等比较运算。
使用make_optional()来创建optional对象的话可以不用指定参数的类型,它可以根据参数来自动推导optional的类型。
#include <vector>
#include "boost/optional.hpp"
#include "boost/typeof/typeof.hpp"
int main()
{
boost::optional<int> op0;
boost::optional<int> op1(boost::none);
assert(op0 == op1);
int n = op0.get_value_or(); boost::optional<string> ops("test");
cout << *ops << endl; vector<int> vc;
boost::optional<vector<int>&> opv(vc);
opv->push_back();
assert(vc.size() == ); boost::optional<double> opd = boost::make_optional(12.56);
cout << *opd << endl; BOOST_AUTO(x, boost::make_optional());
assert(*x == ); return ;
}
in_place()
optional要求参数具有拷贝语义, 因为它会使用参数值的临时拷贝,如果参数是一个复杂的对象的话这种拷贝方式效率就会很慢,我们可以使用boost库in_place_factory中的in_place()函数来就地创建对象,避免对参数值的临时拷贝,eg:
#include "boost/optional.hpp"
#include "boost/utility/in_place_factory.hpp"
int main()
{
boost::optional<string> ops(boost::in_place("test_in_place")); //就地创建optional,不需要临时对象string("test_in_place"); return ;
}
3、assign
使用assign库除了要包含头文件"boost/assign.hpp"外,还要添加对assign命名空间的使用声明:using namespace boost::assign;
assign库重载了operator+=、operator,、operator(),简化了向STL容器增加元素的方法。
#include "boost/assign.hpp"
using namespace boost::assign;
int main()
{
//使用+=向容器添加元素
vector<int> v;
v += , , , * ; map<int, string> m;
m += make_pair(, "one"), make_pair(, "two"), make_pair(, "three"); //使用()向容器添加元素,需要配合assigin的三个函数使用:insert()、push_front()、push_back()
vector<int> v;
push_back(v) () () ();
push_back(v), , , ; list<string> l;
push_front(l) ("cpp") ("jave");
push_front(l), "c#", "python"; map<int, string> m;
insert(m) (, "one") (, "two") (, "three"); return ;
}
assigin使用list_of()、map_list_of()/pair_list_of()、tuple_list_of()来使容器构造的时候就完成了元素的填充,即容器的初始化。
vector<int> v = list_of() () ();
map<int, string> m = map_list_of(, "one") (, "two") (, "three");
//tuple_list_of用来初始化元素类型为tuple的容器
boost-实用工具:noncopyable、optional、assign的更多相关文章
- C++ 之Boost 实用工具类及简单使用
本文将介绍几个 Boost 实用工具类,包括 tuple.static_assert.pool.random 和 program_options等等.需要对标准 STL 具备一定的了解才能充分理解本文 ...
- boost实用工具:创建一个禁止复制的类 noncopyable
boost的noncopyable允许创建一个禁止复制的类,使用很简单,但很好用! C++ Code 12345678910111213141516171819202122232425262728 ...
- boost实用工具:assign库了解学习
许多时候,我们需要为容器初始化或者赋值,填入大量的数据; STL容器仅提供了容纳这些数据的方法,但是填充的步骤是相当地麻烦(insert.push_back); 于是,boost::assign出现了 ...
- boost实用工具:typeof库 BOOST_TYPE BOOST_AUTO
boost::typeof库中使用宏BOOST_TYPE和BOOST_AUTO来模拟C++11关键字typeof和auto C++ Code 123456789101112131415161718 ...
- Bootstrap<基础十> 响应式实用工具
Bootstrap 提供了一些辅助类,以便更快地实现对移动设备友好的开发.这些可以通过媒体查询结合大型.小型和中型设备,实现内容对设备的显示和隐藏. 需要谨慎使用这些工具,避免在同一个站点创建完全不同 ...
- 10款让WEB前端开发人员更轻松的实用工具
这篇文章介绍10款让Web前端开发人员生活更轻松的实用工具.每个Web开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具,所以如 ...
- 十款让 Web 前端开发人员更轻松的实用工具
这篇文章介绍十款让 Web 前端开发人员生活更轻松的实用工具.每个 Web 开发人员都有自己的工具箱,这样工作中碰到的每个问题都有一个好的解决方案供选择. 对于每一项工作,开发人员需要特定的辅助工具, ...
- .Net 高效开发之不可错过的实用工具(转)
.Net 高效开发之不可错过的实用工具(转) 本文摘自: http://www.cnblogs.com/powertoolsteam/p/5240908.html#3372237 Visual Stu ...
- 实用工具推荐(Live Writer)(2015年05月26日)
1.写博客的实用工具 推荐软件:Live Writer 使用步骤: 1.安装 Live Essential 2011,下载地址:http://explore.live.com/windows-live ...
- 快速访问WCF服务--ServiceModel 元数据实用工具 (Svcutil.exe)
基本定义 ServiceModel 元数据实用工具用于依据元数据文档生成服务模型代码,以及依据服务模型代码生成元数据文档. SvcUtil.exe ServiceModel 元数据实用工具可在 Win ...
随机推荐
- 100-days: Two
Title: London HIV patient's remission spurs hope for curing AIDS HIV 艾滋病毒 human immunodeficiency vi ...
- Java-分治算法
一.分治算法的原理 分治算法就是将一个规模为N的问题分解成K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,就可以得出原问题的解 二.分治算法的伪代码实现 合并算法Merge ...
- day 08 函数
函数初始: 什么是函数? 函数:是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 一个函数封装一个功能. 1,减少重复代码. 2,增加代码的可读性. 函数的结构 def my_len(): ...
- declare -A color
#!/bin/bash ## 声明变量 declare -A color # 定义颜色 # bc_color : background color color[red]="\e[1;31m& ...
- ubuntu启动进程笔记
--防止程序随着web终端一起被关闭方法: 1.Screen -ls 查看当前进程2.Screen -S XX XX是自定义的进程名回车完 进入这个进程,在这个进程里面 可以启动 程序 3.正常返回: ...
- istio-jaeger-spring boot调用链配置
istio-jaeger-spring boot调用链配置 虽然,istio ingress controller已经生成了jaeger 记录所需要的信息,但是多个分布式之间没法清晰记录相互之间的依赖 ...
- 8F - 采矿
某天gameboy玩魔兽RPG.有一个任务是在一个富含金矿的圆形小岛上建一个基地,以最快的速度采集完这个小岛上的所有金矿.这个小岛上有n(0<n<1000000)个金矿,每个金矿的矿藏量是 ...
- ubuntu12.04下Qt调试器的使用
最近,我一直在用Qt编写C++程序,但在编写过程中遇到了问题,想用Qt Creator中的调试器调试一下,但调试时(在Qt Creator中已配置好相应的调试器)出现“ ptrace:Operatio ...
- 无法将参数 1 从“WCHAR [256]”转换为“const char *”
https://blog.csdn.net/zhangxuechao_/article/details/81064037 字符集 修改为未设置 然后再修改回来unicode 居然好了
- Java中创建对象的四种方法
第一种 使用new关键字 第二种 使用反射技术:1)通过Class类的newInstance()方法:2)通过Constructor类的newInstance方法 第三种 通过Object类的clon ...