带有数据类型的c ++抽象基类将在派生类中定义

时间:2018-04-03 19:09:56

标签: c++ class-design

我希望有一个基类,其数据类型将在派生类中定义。

伪代码

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类来定义它们。任何建议或指导都将不胜感激。

1 个答案:

答案 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> { /* ... */ };

SomeDerivedAnotherDerived实际上没有相同的基类,但它们的基类是同一模板的实例,因此可以避免代码重复。而且 - 你有&#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> { /* ... */ };