【问题标题】:Generate operator== using Boost Serialization?使用Boost序列化生成运算符==?
【发布时间】:2015-07-08 16:10:17
【问题描述】:

问题:我有一组类,我已经为其实现了 boost 序列化 方法。现在,我想将operator== 添加到一个包含许多其他类作为其成员的类。这种比较应该是直截了当的:深入的、成员明智的比较。

想法:由于现有的序列化方法已经告诉编译器它需要知道的一切,我想知道这是否可以用来生成有效的比较运算符。

方法 1: 最简单的方法是比较包含要比较的对象序列化的字符串。这种方法的运行时间可能比手工制作的operator== 实现慢得多。

方法 2: 实施专门的 boost 序列化存档以进行比较。但是,与实现手工操作符或方法 1 相比,实现这一点要复杂得多且耗时得多。

【问题讨论】:

    标签: c++ boost-serialization


    【解决方案1】:

    我最近为可序列化类型的散列做了类似的事情:

    在这里,我“滥用”boost 序列化来获取任何 Boost 多精度数字类型(具有可序列化后端)的哈希函数。

    链接答案中给出的方法比编写自定义存档类型更轻量级并且更容易实现。相反,我编写了一个自定义的自定义 Boost Iostreams 接收器来消化原始数据。 命名空间 io = boost::iostreams;

    struct hash_sink {
        hash_sink(size_t& seed_ref) : _ptr(&seed_ref) {}
    
        typedef char         char_type;
        typedef io::sink_tag category;
    
        std::streamsize write(const char* s, std::streamsize n) {
            boost::hash_combine(*_ptr, boost::hash_range(s, s+n));
            return n;
        }
      private:
        size_t* _ptr;
    };
    

    这是非常高效的,因为它不会在流程中的任何地方存储存档。 (因此它回避了 Approach 1 可怕的低效率)


    应用于平等比较

    遗憾的是,您无法在流模式下轻松进行相等比较(除非您可以确定两个流可以串联使用,这是一个有点挑剔的假设)。

    相反,您可能会使用boost::iostreams::device::array_sinkboost::iostreams::device::back_insert_device 之类的东西来接收原始数据。

    如果内存使用是一个问题,您可能希望在内存中压缩它(Boost Iostreams 也附带了 zip/bzip 所需的过滤器)。但我想这不是你担心的——因为在这种情况下你可能不会试图避免重复代码。你可以直接实现比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-04
      • 2021-07-03
      • 2011-08-26
      • 2021-04-04
      • 2021-03-14
      • 2013-04-08
      • 2012-09-05
      • 1970-01-01
      相关资源
      最近更新 更多