在 C++ 的孙子类中覆盖模板参数?
Posted
技术标签:
【中文标题】在 C++ 的孙子类中覆盖模板参数?【英文标题】:Overriding a template argument in grandchild class in C++? 【发布时间】:2020-09-09 16:02:51 【问题描述】:我有以下层次结构
template<class SettingsType>
class TemplatedBase;
class A : public TemplatedBase<SettingsTypeA>;
class B : public A;
class SettingsTypeA;
class SettingsTypeB : public SettingsTypeA;
有没有办法覆盖B
中的模板特化,使其继承自A
,同时将模板特化SettingsType
设置为SettingsTypeB
【问题讨论】:
感觉像 XY 问题。你到底想达到什么目的?你可以修改多少代码?无论您想做什么,都可以通过对 A 和/或 B 进行一些修改来实现。 @DanM.,这是一个更复杂的问题。我有一个代码库,其中编写了A
类,然后有人决定根据不同的设置,相同的策略,只是不同的设置类型,它的实现可以用于不同的事情。因此,他在构造函数中传递的参数上添加了条件检查以选择正确的 settingType,但系统依赖于传递的模板参数 SettingsType 来实例化需要的几个对象。
你能改变A的实现吗?我也不确定我是否理解“在构造函数中进行条件检查以选择正确的设置类型”如何与模板参数啮合。
【参考方案1】:
一个简单的改变是模板A
,同时给它一个默认值:
template<typename T = SettingsTypeA>
class A : public TemplatedBase<T> ;
然后当B
继承自A
时就可以使用需要的类型了:
class B : public A<SettingsTypeB> ;
【讨论】:
但是class A : public TemplatedBase<SettingsTypeB>
有意义/编译吗?这个问题的措辞好像没有,但信息不足以决定。
@DanM。事情需要以正确的顺序声明,但除此之外,它似乎还不错。
我试过这个,但我得到了Class A is not a template type
似乎fine。只需要重新排序,然后添加
。
嗯,错误确实存在,因为该类的另一个文件中有不必要的前向声明。我删除了它,它按预期工作。我也确实使用了显式模板实例化,因为我知道子类是有限的,并且只使用了一个已知的子集。【参考方案2】:
没有。 模板不是一个类。这是一个模板。
TemplatedBase<SettingsTypeA>
是模板的特定实例化——它只是常规的Foo
类。除此之外没有什么特别之处。
所以您的问题相当于询问您是否可以在下面的示例中将C
更改为D
:
class A : public C;
class B : public A;
【讨论】:
以上是关于在 C++ 的孙子类中覆盖模板参数?的主要内容,如果未能解决你的问题,请参考以下文章