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



我很懒,我不想写两次相同的代码,那么在这种情况下我该如何避免呢? 我在树中有节点,其中一些节点具有如下所示的成员_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

您可以使用 traits 结构选择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 {} ;

最新更新