我需要一种方法来计算数据集中的各种类型的异常。因此,我考虑使用一个通用的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
头文件,也无需在其定义文件之外公开子类。缺点是类型错误仅在链接时而不是编译时被捕获。