出于日志记录的目的,我想将各种类(出于这个原因,我希望采用通用方法)适应键值字典:这可以看作是“键值序列化”。

假设键是预定义的,并且根据我们要适应的输入类,每个值可能对应于一个特定的属性。
值始终可以封装到std :: string中。

这是我的方法:

创建一个可以转储到数据库中的适配器类

#include <keys.h> // enum with possible keys, defining type Key_t

namespace generic
{
    class Adapter
    {
        public:
            Adapter();
            virtual ~Adapter();
            virtual void init() = 0;

        private:
            std::map<Key_t, std::string> _data;
    }
}


对于每个可能的客户端,请在其命名空间中专门化适配器类,假设它与任何客户端的特定业务对象模型成为朋友(以轻松访问属性),并且它通过其构造函数中的const引用接收此类模型的实例。

例如

#include <generic/Adapter.h>

#include <client1/bom1.h>
#include <client1/bom2.h>
...
#include <client1/bomN.h>

namespace client1
{
    class Adapter : public generic::Adapter
    {
        public:
            Adapter(const Bom1& bom1,
                    const Bom2& bom2,
                    const BomN& bomN)
            : _bom1(bom1), _bom2(bom2), _bomN(bomN)
            {}

            void init()
            {
                // Explicit data mapping in here
                 _map[NAME] = _bom1._name;
                 _map[TITLE] = _bom2._title;
                 ....
                 ....
            }

        private:
            Bom1 _bom1;
            Bom2 _bom2;
            BomN _bomN;
      }
}


您如何看待这种方法?
在c ++中,有没有更通用的方法来实现这一目标?
您的设计是什么?

谢谢!

更新资料

当实施新客户端时,日志记录引擎不应更改:这就是为什么自适应逻辑应分布在客户端而不是在日志记录引擎的核心中实现的原因。
仅在需要新密钥时才更新日志记录引擎(这可能意味着数据库结构发生了变化)。

最佳答案

我会存储键和值的序列化字符串。
Here我正在使用ldbSerialize方法,该方法默认情况下使用boost序列化,并且可以轻松地进行专门化,而无需创建新类。对于每种新类型的密钥,只需添加一个新的规范化即可:

template <> inline void ldbSerialize<Key32> (string& bytes, const Key32& key) {
  bytes += key.whatever();
}

关于c++ - 数据映射:从“any”类到通用键值映射(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14067794/

10-13 09:07