gpt4 book ai didi

c++ - 通过重载而不丢失功能来专门化一个类

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:23 24 4
gpt4 key购买 nike

我正在开发一个简单的数据到 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 等),并且有一些重载用于一些更复杂的结构( vector 、映射等)。假设我现在有一个具有以下数据结构的项目:

struct MyStruct {
int width, height;
};

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

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

问题是:重载子类中的add_value函数后,其父类形式不再可用。是否可以重载 add_value 函数作为父类中提供的函数的特化,即防止子类在重载后忘记其父类的更通用的方法?

最佳答案

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)
{

}

关于c++ - 通过重载而不丢失功能来专门化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9706627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com