Два подкласса имеют одинаковый код, но разные базовые классы.Как я могу обеспечить повторное использование? - PullRequest
0 голосов
/ 24 июня 2018

Я ленивый, я не хочу писать один и тот же код дважды, так как я могу избежать этого в этом случае? У меня есть узлы в дереве, некоторые из них имеют член _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 голосов
/ 24 июня 2018

Вы можете выбрать базовый класс 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 {} ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...