关于c ++:使用模板函数设计层次结构类

Designing hiearchical classes with template function

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

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

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

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

我也考虑过crtp,但它是一个选项,因为实例必须能够放入容器中,并且可以在不知道具体类型的情况下访问:

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

对于可能类型的T也不能超载。

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

除此之外,你会为此类问题推荐参考书(最好是书籍)吗?


这不是很容易用C++完成的。它与所谓的"第一类多态"有关,这意味着如果C++中的值可以具有多态类型,那么这将是很容易的。事实并非如此。

如果您可以使用通用解决方案(这意味着代码f对于所有T都必须相同),那么您可以这样做,但这将是一项艰巨的任务。

基本上,您将希望用一个类型不是泛型的参数替换您的const T &t参数,但将捕获所有可能类型的T所需要的所有行为f

例如,假设T是一个函数,fint参数调用。在这种情况下,您将把声明更改为

1
  virtual void func(const std::function<void(int)>& t) { ... }

虚拟功能将开始工作。但是,这意味着在派生类中实现T之前,必须先修复它的接口(也就是说,如果您改变主意,想用ostream类型的参数调用T,那么您就走运了)。

然而,创建这种多态包装器的范围从简单(如boost::anyboost::function)到困难甚至不可能(any_iterator)。这完全取决于你想做什么。


不能将编译时多态性(模板)与运行时多态性混合使用。问题是,使用模板时,编译器将按需生成代码,在您的特定情况下,您需要根据向量中对象的运行时类型来决定要实例化的成员函数。

如果可以与方法一起使用的类型数量有限,则可以提供不同的虚拟重载,如果不想手动执行此操作,则可以使用所有类型t定义类型列表,然后使用该类型列表生成方法…但这对于编码和维护来说是很糟糕的。

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