【发布时间】:2018-03-05 11:47:41
【问题描述】:
我认为这是一个简单的问题,但我的 C++ 知识也是如此。
我有一个名为 Learner 的课程:
template <class T>
class Learner {
T* _someRef;
(...)
}
以及对象继承的基类。
我的想法是让 Learner 接受任何 Base 子类的对象,例如Base1、Base2 等。我可以使用 c++ 11 的 type_traits 断言类型。问题是,我需要为每个基本扩展提供模板专业化,例如:
template Learner<T>::Learner(...) { //implementation };
// However I am required to declare template-specifications for each Base
// derived type, else I'll get compiler errors. This seems useless as
// the generic-inplementation will still be called, but requires me to
// specify a declaration for each Base extension.What if I have n Base
// extensions, makes no sense to do this for 50 Base extensions.
template Learner<Base1>::Learner(...);
template Learner<Base2>::Learner(...);
这在一定程度上违背了我想要实现的目的,因为每个类的操作都是相同的,因为它们都实现了 Base 的虚函数。我怎样才能做到这一点?制定 n 个模板规范似乎不正确......它适用于少量扩展,但如果它只是难以处理,则适用于大量扩展。
【问题讨论】:
-
与您的问题无关,但我对将运行时多态性(虚拟+继承)工具与静态多态性工具(模板)混合的想法有点困惑。不过,也许您有正当理由这样做!
-
@Caninonos - 可悲的是,我不知道这两者之间的区别。最有可能的是,我只是在尝试,就像我说的那样,我的 C++ 知识很少。
-
每个派生类的虚方法都可以简单地用 override 来声明。
-
@FrancisCugler - 我当然是。事情是学习者的声明要求我为每个基类派生提供专业化声明。
-
@Horus 啊,由于您显示的代码量很少,所以不确定。至于 static_assert(...),这不是我的优势之一,至于部分专业化......它也让我变得更好。