C++ IDisposable 接口抽象类实现

每个C/C++对象实例都应正确实现 IDisposable 接口,以确保对象实例能够正确释放持有的托管资源,而不仅仅只是依赖于 C++ RAII机制调用对象的析构函数。

这是因为并非所有的 C/C++ 对象,都通过析构函数来处理资源释放是正确的,例如:共享指针引用的 C/C++ 对象,且该对象需要一定时间才能完成资源的全部释放,这在多核并行编程上面是很常见的需求,这个时候依赖于析构处理,可能带来资源释放的不安全性。

本 IDisposable  接口类为 C/C++ 17 标准构建,允许用户调用实例的 Dispose 函数(若类成员 Dispose 函数不存在,即不调用,它是基于模板元编程实现的)

源实现:

    class IDisposable : public Reference {
    public:
        template <typename T>
        struct HAS_MEMBER_DISPOSE_FUNCTION {
        private:
            template <typename U>
            static auto                         SFINAE_TEST(T*) -> decltype(std::declval<U>().Dispose(), std::true_type());

            template <typename U>
            static std::false_type              SFINAE_TEST(...);

        public:
            static constexpr bool               value = decltype(SFINAE_TEST<T>(NULL))::value;
        };

        template <typename T>
        static bool                             Dispose(const T& obj) noexcept { /* CXX11: typename std::enable_if<HAS_MEMBER_DISPOSE_FUNCTION<T>::value, bool>::type */
            if constexpr (std::is_pointer<T>::value) {
                return DISPOSE_NPTR(obj);
            }
            if constexpr (stl::is_shared_ptr<T>::value) {
                return DISPOSE_SPTR(obj);
            }
            elif constexpr (stl::is_unique_ptr<T>::value) {
                return DISPOSE_UPTR(const_cast<T&>(obj));
            }
            elif constexpr (HAS_MEMBER_DISPOSE_FUNCTION<T>::value) {
                return DISPOSE_COBJ(const_cast<T&>(obj));
            }
            else {
                return false;
            }
        }

        template <class... TReferences>
        static void                             DisposeReferences(TReferences&&... objects) noexcept {
            (IDisposable::Dispose(objects), ...);
        }

    public:
        virtual void                            Dispose() noexcept = 0;
        virtual                                 ~IDisposable() noexcept = default;

    private:
        template <typename T>
        static bool                             DISPOSE_COBJ(T& obj) noexcept {
            if constexpr (HAS_MEMBER_DISPOSE_FUNCTION<T>::value) {
                obj.Dispose();
                return true;
            }
            return false;
        }

        template <typename T>
        static bool                             DISPOSE_NPTR(T* obj) noexcept {
            if constexpr (HAS_MEMBER_DISPOSE_FUNCTION<T>::value) {
                if (obj) {
                    obj->Dispose();
                    return true;
                }
            }
            return false;
        }

        template <typename T>
        static bool                             DISPOSE_SPTR(const std::shared_ptr<T>& obj) noexcept {
            if constexpr (HAS_MEMBER_DISPOSE_FUNCTION<T>::value) {
                if (obj) {
                    obj->Dispose();
                    return true;
                }
            }
            return false;
        }

        template <typename T>
        static bool                             DISPOSE_UPTR(const std::unique_ptr<T>& obj) noexcept {
            if constexpr (HAS_MEMBER_DISPOSE_FUNCTION<T>::value) {
                if (obj) {
                    obj->Dispose();
                    return true;
                }
            }
            return false;
        }
    };

相关推荐

  1. C++ IDisposable 接口抽象实现

    2024-03-25 18:36:01       22 阅读
  2. 接口抽象

    2024-03-25 18:36:01       43 阅读
  3. 抽象接口

    2024-03-25 18:36:01       34 阅读
  4. C# 抽象接口

    2024-03-25 18:36:01       15 阅读
  5. 抽象接口

    2024-03-25 18:36:01       11 阅读
  6. C# 抽象接口

    2024-03-25 18:36:01       40 阅读
  7. 接口抽象的区别

    2024-03-25 18:36:01       18 阅读
  8. 接口抽象和内部

    2024-03-25 18:36:01       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 18:36:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 18:36:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 18:36:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 18:36:01       20 阅读

热门阅读

  1. 计算机网络参考模型(OSI和TCP/IP 网络模型)

    2024-03-25 18:36:01       17 阅读
  2. 什么是原型链

    2024-03-25 18:36:01       19 阅读
  3. AD实用设置教程

    2024-03-25 18:36:01       16 阅读
  4. C语言 指针综合应用 ( 高阶应用 )

    2024-03-25 18:36:01       19 阅读
  5. Redis面试题

    2024-03-25 18:36:01       18 阅读
  6. ABAP 编程中 JASON 字符中 % 百分号如何处理?

    2024-03-25 18:36:01       18 阅读
  7. C语言字符串和字符数组有什么区别?

    2024-03-25 18:36:01       16 阅读
  8. 卡尔曼滤波

    2024-03-25 18:36:01       20 阅读
  9. TG油封的优点与作用?

    2024-03-25 18:36:01       19 阅读
  10. DolphinDB 常见数据库错误代码大全

    2024-03-25 18:36:01       22 阅读
  11. 刷算法题day04-错误总结(Double精度)

    2024-03-25 18:36:01       17 阅读