3

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

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

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

由于模板函数不能是虚拟的,有没有办法解决这个问题,这将允许构建具有不同输入的具体异常,但允许我使用通用接口来完成其余的行为?

4

1 回答 1

1

带有模板参数的虚函数不起作用,但您可以使用静态模板函数:

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在添加新类时接触头文件,也不需要在其定义文件之外公开子类。缺点是类型错误只会在链接时而不是在编译时被捕获。

于 2013-06-19T21:03:29.923 回答