我需要一种方法来计算数据集中的各种类型的异常。因此,我正在考虑使用通用的Anomaly接口,它定义了具体异常的接口。然后我的应用程序可以简单地使用接口来迭代各种具体策略。
我遇到的主要问题是混凝土异常的构造需要不同的输入。例如,
class Anamoly
{
public:
template <typename T>
virtual Anamoly * getInstance(T &) = 0;
virtual void processAnamoly() = 0;
virtual bool containsAnamoly() = 0;
virtual void logAnamoly() = 0;
};
由于模板函数不能是虚拟的,有没有办法解决这个问题,这将允许构建具有不同输入的具体异常,但是,允许我使用通用接口来执行其余的行为吗?
答案 0 :(得分: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
头文件,也不需要在定义文件之外公开子类。缺点是类型错误仅在链接时捕获,而不是在编译时捕获。