c++ - 使用模板函数设计分层类

标签 c++ templates polymorphism

我正在编写一个类 Base,它有一个采用模板参数的成员函数:

class Base {
  template<class T>
  void func(const T& t) { ... }
};

有一个类 Derived,它在概念上继承了 Base 的性质,并且具有相同的函数 func,但实现不同。

起初我想从 Base 派生 Derived 并使 func 成为虚拟的,但我不能,因为它是模板。

我也想到了 CRTP,但它是一个选项,因为实例必须能够放入容器中并且在不知道它们的确切类型的情况下可以访问:

std::vector<Base*> v = ...;
v[0]->func(...);
v[1]->func(...);

重载 T 的可能类型也不是一种选择。

这种情况的最佳解决方案是什么?

除了主题之外,您是否会为此类问题推荐引用资料(最好是书籍)?

最佳答案

你不能像那样混合编译时多态性(模板)和运行时多态性。问题在于,使用模板时,编译器将在使用时按需生成代码,在您的特定情况下,您希望根据的运行时类型来决定实例化哪个成员函数 vector 中的对象。

如果可以与这些方法一起使用的类型数量有限,您可以提供不同的虚拟重载,如果您不想手动执行此操作,您可以定义一个包含所有类型 T 的类型列表,然后使用该类型列表来生成方法...但这将很难编码和维护。

我建议您陈述问题的实际要求(而不是您提出的解决方案的要求),这样人们就能够提供替代方法。

关于c++ - 使用模板函数设计分层类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7648430/

相关文章:

c++ - 如何在 C++ 中使用模板函数实现父类?

c++ - 使用 VS 公共(public)继承进行模板化

c++ - 多态数据转换/转换设计模式

haskell - 什么是单态性限制?

c++ - SteamVR 覆盖 Controller 输入?

python - 使用 pybind11 将抽象类作为参数作为参数传递

c++ - 具有互斥锁的 Visual C++ 线程不阻塞

c++ - 需要当前进程的 PID,getpid() 返回 -1

c++ - 仅当类型为 std::complex 时才缩放

C++ - 好的还是坏的做法?