通过重载专门化一个类而不会失去功能

nij*_*sen 1 c++ oop inheritance

我正在为XML序列化程序开发一个简单的数据用于培训目的.现在我已经完成了序列化器的基类,我想为不同项目的数据结构派生一个专门的序列化器.我的基本序列化程序具有以下功能:

class Serializer {
public:
    template <class T> void add_value(const std::string &key, T *value);
    template <class T> void add_value(const std::string &key, std::vector<T*> *value);
};
Run Code Online (Sandbox Code Playgroud)

基本序列化器能够处理大多数原始数据结构(int,double,bool等),并且对于一些更复杂的结构(向量,映射等)存在一些重载.让我们假设我现在有一个具有以下数据结构的项目:

struct MyStruct {
    int width, height;
};
Run Code Online (Sandbox Code Playgroud)

我现在想从我的基本序列化器派生一个能够处理该结构的序列化器,以及它已经知道的结构:

class MyStructSerializer : public Serializer {
    void add_value(const std::string &key, MyStruct *value);
};
Run Code Online (Sandbox Code Playgroud)

问题是:在add_value子类中重载函数之后,它的父类形式不再可用.是否可以将add_value函数重载为父类中提供的函数的专门化,即保持子类在重载后不会忘记其父类的更通用的方法?

Rob*_*obᵩ 8

using关键字将导入的基类的成员进入派生类:

include <vector>
#include <string>
#include <iostream>
// Note: __PRETTY_FUNCTION__ is non-standard
#define X(x) (std::cout << __PRETTY_FUNCTION__ << "\n")
class Serializer {
public:
  template <class T> void add_value(const std::string &key, T *value)
    { X(); }
  template <class T> void add_value(const std::string &key, std::vector<T*> *value)
    { X(); }
};

struct MyStruct {
    int width, height;
};

class MyStructSerializer : public Serializer {
public:
    using Serializer::add_value;
    void add_value(const std::string &key, MyStruct *value)
      { X(); }
};

int main () {
  MyStructSerializer s;
  MyStruct ms;
  int i;
  s.add_value("Hello", &i);
  s.add_value("Hello", &ms);
}
Run Code Online (Sandbox Code Playgroud)

虽然,专业化不是更容易Serializer::add_value,而不是从中衍生出来Serializer?像这样:

template <>
void Serializer::add_value<MyStruct>(const std::string &key, MyStruct* value)
{

}
Run Code Online (Sandbox Code Playgroud)