zoukankan      html  css  js  c++  java
  • obs 之 OBSObj



    从实例学习c++之:

    1. 内联构造/虚构
    2. 移动构造/移动赋值
    3. 禁用拷贝构造和赋值
    4. 该类虚构不为 virtual 
    5. 使用实例 using OBSDisplay = OBSObj<obs_display_t*, obs_display_destroy>;

    //k 18-02-06 23:13 2 zn#1 不被实例化的对象
    //k 18-02-06 23:47 28 zn#1 这里 destroy 是一个 nontyp parameter,第一次见这个用法
    /* objects that are not meant to be instanced */
    template<typename T, void destroy(T)> class OBSObj
    {
        T obj;
    
    public:
        //k 18-02-06 23:32 3 zn#1 构造函数内联;见 effective c++ item 30,说了很多函数(包括构造)内联的不利之处
        //k 18-02-06 23:33 9 zn#1 这是另一种说法 ,构造函数与析构函数在代码链接上并没有什么不同,只是一般不显式调用罢了,所以可以inline是肯定的。
        inline OBSObj() : obj(nullptr)    {}
        inline OBSObj(T obj_) : obj(obj_) {}
        //k 18-02-06 23:34 14 zn#1 禁用 copy ctor
        inline OBSObj(const OBSObj&) = delete;
        //k 18-02-06 23:35 16 zn#1 移动构造函数
        //k 18-02-06 23:44 18 zn#1 参数是一个右值引用
        inline OBSObj(OBSObj &&other) : obj(other.obj)
        {
            other.obj = nullptr;
        }
    
        inline ~OBSObj()
        {
            destroy(obj);
        }
    
        inline OBSObj &operator=(T obj_)
        {
            if (obj_ != obj)
                destroy(obj);
            obj = obj_;
            return *this;
        }
        //k 18-02-06 23:45 22 zn#1 赋值
        inline OBSObj &operator=(const OBSObj&) = delete;
        //k 18-02-06 23:45 23 zn#1 移动赋值
        inline OBSObj &operator=(OBSObj &&other)
        {
            if (obj)
                destroy(obj);
            obj       = other.obj;
            other.obj = nullptr;
            return *this;
        }
    
        inline operator T() const
        {
            return obj;
        }
    
        //k 18-02-06 23:46 24 zn#1 关系运算符重载, == 和 !=
        inline bool operator==(T p) const
        {
            return obj == p;
        }
        inline bool operator!=(T p) const
        {
            return obj != p;
        }
    };
  • 相关阅读:
    Redis服务器配置
    Spark History Server配置使用
    CentOS7.3安装Nginx
    U盘安装CentOS7的最终解决方案
    iconfont_3种引用方式
    div+css 让一个小div在另一个大div里面 垂直居中
    JavaScript数组方法
    addEventListener()和removeEventListener()
    js获取网页高度
    Linux修改命令行样式
  • 原文地址:https://www.cnblogs.com/IS2120/p/8424811.html
Copyright © 2011-2022 走看看