C++ C++;选择要使用的运算符重载?

C++ C++;选择要使用的运算符重载?,c++,templates,operator-overloading,C++,Templates,Operator Overloading,我正在编写一组用于自定义序列化和反序列化的类。我想我会使用>操作符,因为它们一般都会传达这一含义。让我们从一个类开始,该类用于处理对泛型流的写入 class Writer { public: virtual void writeBytes(const void* p, size_t n) = 0; template <typename T> void write(const T& v) { writeBytes(&v, sizeof(v));

我正在编写一组用于自定义序列化和反序列化的类。我想我会使用>操作符,因为它们一般都会传达这一含义。让我们从一个类开始,该类用于处理对泛型流的写入

class Writer
{
public:
  virtual void writeBytes(const void* p, size_t n) = 0;
  template <typename T> void write(const T& v)
  {
    writeBytes(&v, sizeof(v));
  }
  template <typename T> Writer& operator<<(const T& v)
  {
    write(v);
    return *this;
  }
};

这是有趣的部分。显然,如果我使用方法调用,它会完全按照它应该做的做。但是使用非常简单——它只是遵循重载解析规则。您有两个重载的
运算符。您在一些地方有未定义的行为,因为您有返回类型的函数,其实现不返回任何内容。你应该先把它修好。接得好。这是从一组更大的代码中复制和粘贴的,所以为了清晰起见,我尝试对其进行精简。我想我已经找到了答案。问题是Writer中的模板将生成特定于任何类的运算符(如果该类不存在)。因此,SerializableBuffer会为其生成一个运算符。那不是很有帮助。第一:有人能证实吗?第二:如何正确地完成这项工作?“模板引擎是否胜过一个后裔?”是的,这是我讨厌的C++语言规则之一。将派生类对象传递给一个函数,该函数的可用选项是模板(可以是任何对象)或基类,编译器将选择模板,而不是隐含的基类静态转换。我在写评论时也说到了同样的一点。最后一次尝试是为模板编写专门化,是否可以限制模板,使其不妨碍可序列化类?也许可以重新定义
Writer::operator
class Serializable
{
public:
  virtual Writer& serialize(Writer& writer) const = 0;
};

Writer& operator<<(Writer& writer, const Serializable& s)
{
  s.serialize(writer);
  return writer;
}
class SerializableBuffer : public Serializable
{
public:
  SerializableBuffer() : data_(NULL), length_(0) { }
  SerializableBuffer(void* data, size_t length) : data_(data), length_(length) { }
  virtual Writer& serialize(Writer& writer) const
  {
    writer.writeBytes(data_, length_);
    return writer;
  }
private:
  void* data_;
  size_t length_;
};
  unsigned char input[] = { 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0x12, 0x34 };
  SerializableBuffer sb(input, sizeof(input));

  unsigned char d[8]; 
  BufferWriter writer(buffer(d));

  writer << sb;
  unsigned char input[] = { 0xFF, 0xFE, 0xFD, 0xFC, 0xFB, 0xFA, 0x12, 0x34 };
  SerializableBuffer sb(buffer(input));

  unsigned char d[8]; 
  BufferWriter writer(buffer(d));

  writer << (Serializable&)sb;
template <typename T> Writer& Writer::operator<<(const T& v);
Writer& operator<<(Writer& writer, const Serializable& s);
template <typename T>
std::enable_if<!std::is_base_of<Serializable, T>::value, Writer &>::type
operator<<(const T &v)