使用模板实现多态性
Using templates for polymorphism
所以我在一些遗留代码中得到了一些编译时多态性。即
我有一个基类要使用,它接受一个模板形参。
template<typename HANDLER>
class Base
{
virtual HANDLER * make_handler();
// other methods
};
make_handler
使用一个接受两个参数的特定构造函数来构造HANDLER。
处理程序通常是我们唯一需要更改的代码共享,它只做一个方法std::size_t handle_data(const char *, std::size_t length);
作为入口点
class SpecificHandler
{
SpecificHandler(uint32_t id, uint32_t source_id);
std::size_t handle_data(const char *, std::size_t length);
// other methods
};
使用的class Child : public Base<SpecificHandler>
{
// other overridden methods
};
问题是我想在我的SpecificHandler类中传递另一个参数,即
class OtherSpecificHandler
{
OtherSpecificHandler(uint32_t id, uint32_t source_id, uint32_t other_id);
};
不幸的是,基类调用模板中的两个参数构造函数。
我目前的工作是覆盖make_handler()
调用,返回用3个参数构造函数创建的处理程序,即
class Child : public Base<OtherSpecificHandler>
{
virtual OtherSpecificHandler * make_handler();
// other overridden methods
};
不幸的是,因为模板的东西是在编译时完成的,所以我仍然必须提供2个参数的构造函数(实际上我只是为第三个参数提供了一个默认参数),这感觉不对。
通常情况下,我会用Handler的指针依赖注入来解决这个问题,而不是使用模板,但这在很多地方使用,我宁愿不改变它。
我还有其他选择吗?
谢谢
首先想到的是将基类方法设置为纯虚方法:
template<typename HANDLER>
class Base
{
virtual HANDLER * make_handler() = 0;
//other stuff
};
这当然意味着每个派生类都必须重载make_handler
,即使每个其他处理程序类都具有相同的双参数构造函数。为了避免重复,在层次结构中插入另一个层:
template<typename HANDLER>
class BaseWithStandardHandlerConstruction : public Base<Handler>
{
virtual HANDLER * make_handler() override //maybe final as well?
{
return new HANDLER("meow", 4);
}
//that's it - nothing else goes here...
};
则任何具有"普通"处理程序的类派生自后者,而具有"特殊"处理程序的类派生自前者:
class Child : public BaseWithStandardHandlerConstruction<SpecificHandler>
{
// other overridden methods, no make_handler needed
};
class OtherChild : public Base<OtherSpecificHandler>
{
virtual OtherSpecificHandler * make_handler() override;
// other overridden methods
};
您可以模板专门化Base
template <>
OtherSpecificHandler* Base<OtherSpecificHandler>::make_handler() {
return new OtherSpecificHandler(42, 5, 12); // With correct parameter ofc.
}
相关文章:
- 如何在这个简单的最小示例中实现多态性?
- 使用连续内存实现多态性
- 实现后期多态性的最佳方法
- 将多态性与运算符 + 重载模板化类结合使用.如何实现基类?
- 多态性实现
- 在 C++ 中实现多态性有哪些不同的方法
- 可以使用不同的实现文件来实现多态性吗
- 如何在嵌套类中实现多态性
- 如何利用多态性实现数据本地化
- 一个具有多态性的2-3树的设计与实现
- 如何在多态性c++中实现这个类
- 如何实现几个函数的编译时多态性
- 我们可以通过const函数实现多态性吗
- 用排序函数实现多态性
- c++中通过虚函数实现的运行时多态性
- 如何:在打印函数中实现多态性
- 使用模板实现多态性
- 虚拟函数是在C++中实现运行时多态性的唯一途径吗
- 在这种情况下,哪种设计模式有利于实现运行 tiime 多态性
- 技术实现多态性,但节省4字节