gpt4 book ai didi

c++ - 模板成员函数的接口(interface)

转载 作者:行者123 更新时间:2023-11-30 04:26:13 25 4
gpt4 key购买 nike

是否有一些通用的方法来为模板成员函数定义接口(interface)?我想创建一些带有模板成员函数声明的纯抽象基类,这些模板成员函数应该在派生类中被覆盖。比我希望能够通过接口(interface)调用派生类的功能。我知道虚拟模板成员函数是不允许的。所以直到现在我想出了以下解决方案(见下文)。我想知道的是我的方法是否设计不当,或者是否有更好的方法来实现我的目标:

编辑:我要实现的是一个序列化系统(类似于boost::serialization)。因此,我希望有一个通用的基础接口(interface)函数 serialize ,它可用于保存和加载对象。保存和加载的正确函数调用将由调用 *do_serialize* 函数时提供的派生存档类决定。

因为我不确定我提供的解决方案,所以我想问一下是否有更好的方法(甚至更简单的方法)来实现我的目标?

接口(interface):

template<typename Derived>
class Archive{
public:
virtual ~Archive() = 0 {}

template<typename T>
Archive& serialize(T t) {
Derived* derived = static_cast<Derived*>(this);
return derived->serialize_derived(t);
}
};

template<typename Derived>
class Writer : public Archive<Derived> {
public:
virtual ~Writer() = 0 {}

template<typename T>
void write(const T& t) {
Derived* derived = static_cast<Derived*>(this);
derived->write_derived(t);
}
};

template<typename Derived>
class Reader : public Archive<Derived> {
public:
virtual ~Reader() = 0 {}

template<typename T>
void read(const T& t) {
Derived* derived = static_cast<Derived*>(this);
derived->read_derived(t);
}
};

派生类:

class BinaryWriter : public Writer<BinaryWriter> {
public:
template<typename T>
BinaryWriter& serialize_derived(T t) {
save(t);
return *this;
}

template<typename T>
void save(T t) {
std::cout << "DerivedWriter::save: " << t << std::endl;
}

template<typename T>
void write_derived(const T& t) {
std::cout << "DerivedWriter::write_derived: " << t << std::endl;
}
};

class BinaryReader : public Reader<BinaryReader> {
public:
template<typename T>
BinaryReader& serialize_derived(T t) {
load(t);
return *this;
}

template<typename T>
void load(T t) {
std::cout << "DerivedWriter::load: " << t << std::endl;
}

template<typename T>
void read_derived(const T& t) {
std::cout << "DerivedReader::read_derived: " << t << std::endl;
}
};

示例测试函数和调用(注意:同样需要调用 Writer/Reader 接口(interface)(此处省略其他派生的 Writer/Reader 类(即 TextReader、XMLReader 等))):

template<typename Derived, typename T>
void do_serialize(Archive<Derived>& obj, T t) {
obj.serialize(t);
}

DerivedWriter dw;
DerivedReader dr;

do_serialize(dw, 1);
do_serialize(dr, 2);

输出:

DerivedWriter::save: 1
DerivedReader::read: 2

最佳答案

在知道这种技术称为 CRTP 之后(感谢 pmr),我找到了这篇文章 CRTP to avoid virtual member function overhead我认为这回答了我的问题。正如 Kerrek SB 在那篇文章的回答中所述,该技术可用于提供接口(interface)。在我的例子中,甚至可以为模板成员函数定义此接口(interface)。

似乎这种模式很常见(我不确定)所以我会接受它作为我问题的答案。

感谢大家的回复!

关于c++ - 模板成员函数的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11678440/

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