我需要一种方法来计算数据集中的各种类型的异常。因此,我考虑使用一个通用的Anomaly接口(interface),该接口(interface)定义了具体异常的接口(interface)。然后,我的应用程序可以简单地使用该接口(interface)来迭代各种具体策略。

我遇到的主要问题是具体异常的构造需要不同的输入。例如,

class Anamoly
{
public:
  template <typename T>
  virtual Anamoly * getInstance(T &) = 0;
  virtual void processAnamoly() = 0;
  virtual bool containsAnamoly() = 0;
  virtual void logAnamoly() = 0;
};

由于模板功能不能是虚拟的,有没有办法解决这个问题,这将允许构造具有不同输入的具体异常,但允许我将通用接口(interface)用于其余行为?

最佳答案

具有模板参数的虚拟函数无法正常工作,但是您可以使用静态模板函数:

class Anomaly {
public:
  template <typename T>
  static Anomaly * getInstance(T &);
  virtual void processAnamoly() = 0;
  virtual bool containsAnamoly() = 0;
  virtual void logAnamoly() = 0;
};

然后,无论何时定义相关的子类,都应实现Anomaly::getInstance(),例如myanomaly.cpp:
class MyAnomaly : public Anomaly {
  // implement virtual functions
};

Anomaly * Anomaly::getInstance(MyType & t) {
  return new MyAnomaly(t);
};

这种方法的优点是,每次添加新类时都无需触摸anomaly.h头文件,也无需在其定义文件之外公开子类。缺点是类型错误仅在链接时而不是编译时被捕获。

10-07 15:41