gpt4 book ai didi

c++ - 简单的子类模板模式

转载 作者:行者123 更新时间:2023-11-30 01:12:34 26 4
gpt4 key购买 nike

我有一些带有虚方法 foo()Base 类。我需要生成几个结构完全相同的子类,并以不同的方式简单地覆盖 foo() 。我想出了这个简单的非类型参数模板:

template<const int Index>
class Derived : public Base
{
virtual void foo() {....};
};



typedef Derived<1> Derived_1;
typedef Derived<2> Derived_2;
...
...

然后方法 foo 专门针对每种情况。

我对这个策略并不完全满意,因为你需要小心索引冲突(虽然这没什么大不了的)并且实现文件失去了可读性,因为你需要知道索引 '2' 或 '3' 对应的是什么.最好用字符串

typedef Derived<"Derived_2"> Derived_2;

但字符串文字不允许作为模板参数。

在这种情况下,这是推荐使用的模式吗?有什么更好的吗? (也许这是一个已知的模式,甚至有一个名字,但我不知道要寻找什么。)

最佳答案

似乎用继承对这种关系进行建模更接近您要实现的语义。

struct Derived1 : Derived
{
using Derived::Derived;
virtual void foo() {
std::cout << "Derived1" << std::endl;
};
};

struct Derived2 : Derived
{
using Derived::Derived;
virtual void foo() {
std::cout << "Derived2" << std::endl;
};
};

有了这个版本,您可以愉快地使用任何 DerivedN 版本作为 Derived 对象,因此在它们之间进行转换或在不同版本上一起操作比拥有所有版本更容易交叉派生的成员函数作为模板。

需要 using Derived::Derived; 声明来继承 Derived 可能具有的任何非默认构造函数。

关于c++ - 简单的子类模板模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33935719/

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