Boost 实用工具
健康快乐地成长
Boost库中有很多有用的小工具。说它们小,是因为它们实现的功能比较单纯,代码也都比较简单,在实际产品代码中也往往处于不起眼的角落之中。但是十分有用,最近学习完,总结出来跟大家一起学习
noncopyable
下面我们就看看如何自己和使用boost
库实现一个禁止拷贝的类;
-
自己动手实现
一个很经典的C++惯用法,其原理很好理解,只需要“私有化”拷贝构造函数和拷贝赋值操作符
struct no_copy { private: no_copy(const no_copy&); no_copy& operator=(const no_copy&); };
C++11后,一般使用下面的做法
struct no_copy { no_copy(const no_copy&) = delete; no_copy& operator=(const no_copy&) = delete; };
但如果程序中有大量这样的类,重复这样的代码是相当乏味的,而且代码出现的次数越多,错误可能性更大;
-
怎么利用boost库实现
使用boost::noncopyable
其实很简单,只需要继承noncopyable
即可struct no_copy : boost::noncopyable { };
如果有其他人误写了代码,拷贝构造或赋值这个对象,那么将不能通过编译器的检查:
nocopy x; nocopy y(x); // error: 禁止调用拷贝构造函数 nocopy z; x = y; // error: 禁止调用拷贝赋值运算
-
头文件位置
noncopyable
位于boost
命名空间下,使用时只需要包含下面这个文件就可以了#include <boost/noncopyable.hpp>
-
boost库的实现
struct base_token{}; class noncopyable: base_token { protected: noncopyable() {} ~noncopyable() {} private: // emphasize the following members are private noncopyable( const noncopyable& ); noncopyable& operator=( const noncopyable& ); };
因此,当我们继承
noncopyable
类时,就会自动私有化父类noncopyable
的拷贝构造函数,从而禁止用户从外部访问拷贝构造函数和拷贝赋值函数;
另外一种使用=default
和=delete
的用法就不给大家列举了。 -
题外话
看到这里的小伙伴可能会说了,boost
实现很简单,我可以自己实现一份,或者把boost
的代码抄过来,是的这么做确实没有问题;但是,我个人的意见是不要造轮子,不要重复造轮子,对于造轮子我个人的态度是:“非不能也,实不为也”。我们要会造轮子,但是我们不去造它。
optional
- 未完待续