Boost 实用工具(一)

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

  • 未完待续

Ref

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容