我希望有一个基类,其数据类型将在派生类中定义。
伪代码
PUT
因此,每个派生类将实现提取和比较功能的不同方式。
我不知道如何在<id>
类中为class Base{
public:
void Enroll(vector<int> v){
feature_list.emplace_back(ExtractFeature1(v));
}
vector<double> Compare(vector<int> v){
FeatureType2 ft2 = ExtractFeature2(v);
vector<double> scores;
for (auto &ft1:feature_list){
scores.emplace_back(Compare(ft1, ft2));
}
return scores;
}
protected:
vector<FeatureType1> feature_list;
virtual FeatureType1 ExtractFeature1(vector<int> v)=0;
virtual FeatureType2 ExtractFeature2(vector<int> v)=0;
virtual double Compare(FeatureType1 f1,FeatureType2 f2)=0;
}
和FeatureType1
设置某种占位符类型,然后强制FeatureType2
类来定义它们。任何建议或指导都将不胜感激。
答案 0 :(得分:0)
我希望有一个基类,其数据类型将在派生类中定义。
嗯,你不能完全这样做:必须完全定义基类,以便从中派生类。
但是,您可以使用Curiously-Recurring Template Pattern(CRTP):
template <typename T>
class Base {
using data_type = typename T::data_type;
// this will be a different type for each T - and
// we don't need to know it in advance
void Enroll(const vector<int>& v){
// implementation that can depend on T in many ways.
// Specifically, you can use `data_type`.
}
vector<double> Compare(const vector<int>& v){ /* ... */ }
// ...
};
class SomeDerived : Base<SomeDerived> { /* ... */ };
class AnotherDerived : Base<AnotherDerived> { /* ... */ };
类SomeDerived
和AnotherDerived
实际上没有相同的基类,但它们的基类是同一模板的实例,因此可以避免代码重复。而且 - 你有&#34;基地&#34; class使用派生类中定义的类型,只要它们以相同的方式定义。
编辑(感谢@Aconcagua):您可能不需要完整的CRTP。如果您的基类需要知道的关于派生类的唯一事情是数据类型,那么只需将上的基类模板,即
template <typename DataType>
class Base {
using data_type = DataType;
// ... as before...
};
class SomeDerived : Base<some_data_type> { /* ... */ };
class AnotherDerived : Base<another_data_type> { /* ... */ };