假设我有一个名为BinaryClassifier
的策略接口,可以采取Sample
并返回一个double
代表属于正类的Sample
对象的概率:如何在STL容器中使用策略模式?
struct BinaryClassifier {
virtual ~BinaryClassifier(){}
virtual double classify(std::shared_ptr<Sample> sample) const = 0;
};
我们可能有BinaryClassifier
,例如几种实现,LogisticRegressionBinaryClassifier
。
的Sample
又一个接口只露出两个方法:
struct Sample {
virtual ~Sample() {}
InputFeatures const& get_input_features() const = 0;
double get_label() const = 0;
};
从这两种方法
除了,的Sample
具体实现暴露相当不同的接口(即,它们是不相关的),他们唯一的方面常见的是它们可以通过二元分类器进行分类。
到目前为止这么好。当我们决定引进BinaryClassifier::train
方法出现
问题:
struct BinaryClassifier {
virtual ~BinaryClassifier(){}
virtual double classify(std::shared_ptr<Sample> sample) const = 0;
virtual void train(std::vector<std::shared_ptr<Sample>> samples) = 0;
};
在这一点上,以下将不起作用:
std::vector<std::shared_ptr<ConcreteSample>> concreteSamples = ...;
concreteBinaryClassifier.train(concreteSamples);
这是因为std::vector<std::shared_ptr<ConcreteSample>>
和std::vector<std::shared_ptr<Sample>>
是两个不相关的类型。
的C++ - ISH的解决办法是依靠模板:
template<class SampleType>
virtual void train(std::vector<std::shared_ptr<SampleType>> samples) = 0; // non-working code, template method cannot be virtual
但是模板方法不能virtual
。不过,我希望BinaryClassifier
是一个策略接口,因为可能存在许多BinaryClassifier
实现。在这一点上,即使设计看起来很合理,我仍陷入死胡同。
编辑:此外,有可能发生对给定BinaryClassifier
对象与ConcreteSampleA
向量进行训练,而分类类型的对象ConcreteSampleB
这是模拟在大多数C这种情况的正确方法+用什么方式?
感谢您的回答,这是真的,但在这一点上,首先有'Sample'接口的原因是什么?而且,对于给定的'BinaryClassifier'对象可能发生的事情是'ConcreteSampleA'的向量来训练,同时对'ConcreteSampleB'类型的对象进行分类。 –