两个子类具有相同的代码,但基类不同。如何确保重用?

时间:2018-06-24 16:31:51

标签: c++ c++11

我很懒,我不想两次写相同的代码,所以在这种情况下如何避免呢? 我在树上有节点,其中一些节点具有这样的成员_key:

struct node_base {
    virtual void foo()=0;
    virtual ~node_base() {}
}

template<typename Key>
struct node_key: public node_base {
    node_key(Key k): _key(k) {}
    virtual ~node_key() {}

protected:
    Key _key;
}; 

现在我有两种类型的子节点,一种从node_key继承,另一种仅从node_base继承

struct no_key {};

template<typename Key, typename Data>
struct child: public node_key<Key> {
…
    void foo() {
    //do something with _data
    }
protected:
    Data _data;
}

template<typename Data>
struct child<no_key,Data>: public node_base {
…
    void foo() {
    //do something with _data
    }
protected:
    Data _data;
}

但是您看到我两次写了foo,在两种情况下都相同。我可以做些确保重复使用的事情吗? node_key的优点是我可以有一个指针

node_key<int> *p=new child<int,int>
…
p->foo();

,如果p = new child 会在编译时失败,这很好。我也可以有一个指针。

node_base *p=get_a_child();
p->foo(); 

有关我的树的更多信息: https://www.facebook.com/profile.php?id=100013861179843

1 个答案:

答案 0 :(得分:0)

您可以使用特征结构选择child的基类:

struct no_key {};

template<typename Key, typename Data>
struct child_base_traits {
    typedef node_key<Key> type;
};

template<typename Data>
struct child_base_traits<no_key, Data> {
    typedef node_base type;
};

template<typename Key, typename Data>
struct child: public typename child_base_traits<Key,Data>::type {
    void foo() {
    //do something with _data
    }
protected:
    Data _data;
};

或者,如@Igor所建议的,只需专门研究node_key<no_key>

template<>
struct node_key<no_key> : node_base {} ;