执行模板

时间:2015-08-20 10:02:46

标签: c++ templates c++11 inheritance

我想使用不同的协议创建用于序列化的小型库。所以,我创建了“ interface ”(小抽象类) Serializable - 每个实现它的类都可以被序列化:

class Serializable // interface
{
public:
std::string Serialize(Encoder & encoder) const
    {
    return DoSerialize(encoder);
    }

private:
virtual std::string DoSerialize(Encoder & encoder) const = 0 {}
};

另一方面,我有各种编码器的抽象版本(针对不同的编码):

class Encoder
{
public:
Serialized GetEncoded()
    {
    return DoGetEncoded();
    }

void Encode(const std::string & data)
    {
    DoEncode(data);
    }

... other encoding functions

private:
virtual Serialized DoGetEncoded() = 0 {}

virtual void DoEncode(const std::string & data) = 0 {}
};

我用它像:

Test1 test;
test.test = "abc";

SomeEncoder enc;

cout << "Test::Serialize: " << test.Serialize(enc) << endl;

但也许不是这种方法,在编码器中创建模板化函数会更好(为什么?),例如:

template<typename T>
std::string Serialize(const T & data) const
     {
     return data.Serialize();
     }

// or maybe
std::string Serialize(const Serializable & data) const
     {
     return data.Serialize();
     }

表现出更一致的行为?

我有两个问题:

  1. 哪种方法更好(以OO术语或一般而言)?
  2. 如果是第二个 - 我是应该强制用户继承接口还是提供模板化版本,如果有人想让他的类型可序列化,他必须写这些方法吗?
  3. 我原来的问题好坏参半了 - 我想问一下两者是否应该以相同的类型实现 - 强制从界面派生并使用模板化版本,但这似乎是不必要的,

1 个答案:

答案 0 :(得分:0)

我没有真正连接到任何解决方案,我个人会选择最基本的接口:

struct Serializable{
   virtual std::string serialize () const = 0;
};

让每个实现它的类处理如何进行血清化。有些类甚至不需要编码器,那么为什么要强制使用函数签名呢?

如果DoSerialize只是调用它并返回其返回值,那么

serialize似乎非常冗长,无论如何,为了工作,需要保护它。

在保持界面简洁时,不要让开发人员感到困惑 - 他们不必了解您希望序列化的工作方式 - 他们只是将对象序列化为某种二进制形式。