我认为这是一个简单的问题,但我的 C++ 知识也是如此。
我有一个名为 Learner 的课程:
template <class T>
class Learner {
T* _someRef;
(...)
}
以及对象继承的基类。
我的想法是让学习者接受任何继承 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 个模板规范似乎不对......它对于少量扩展来说效果很好,但对于大量扩展来说,如果它只是棘手的话。
如果我理解你的问题,我想你正在寻找的是static_assert
:
template<typename T>
struct Foo {
static_assert(is_base_of<Base, T>::value, "T must inherit from Base");
};
对于 C++11,您需要提供一条消息:
http://en.cppreference.com/w/cpp/language/static_assert http://en.cppreference.com/w/cpp/language/static_assert
此外,如果需要,您可以使用 type_traits 在编译时检查上有更多选项:
http://en.cppreference.com/w/cpp/language/static_assert http://en.cppreference.com/w/cpp/language/static_assert
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)