我很懒,我不想两次写相同的代码,所以在这种情况下如何避免呢? 我在树上有节点,其中一些节点具有这样的成员_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
答案 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 {} ;