我正在为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);
};
基本序列化程序能够处理大多数原始数据结构(int,double,bool等),并且对于一些更复杂的结构(向量,映射等)存在一些重载。让我们假设我现在有一个具有以下数据结构的项目:
struct MyStruct {
int width, height;
};
我现在想从我的基本序列化程序派生一个能够处理该结构的序列化程序,以及它已经知道的结构:
class MyStructSerializer : public Serializer {
void add_value(const std::string &key, MyStruct *value);
};
问题是:在子类中重载add_value
函数后,它的父类表单不再可用。是否可以将add_value
函数重载为父类中提供的函数的特殊化,即保持子类在重载后不会忘记其父类的更通用的方法?
答案 0 :(得分: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);
}
虽然,Serializer::add_value
专精化不是更容易,而不是从Serializer
派生?像这样:
template <>
void Serializer::add_value<MyStruct>(const std::string &key, MyStruct* value)
{
}