2015-12-07 3 views
0

У меня есть два класса, которые нужно сохранить ссылки друг друга следующим образом:Рекурсивные шаблоны классов

template <typename S> 
class H { 
public: 
    H(const S& s): s_{s} {} 
private: 
    const S& s_; 
} 

А потом

template <typename H> 
class S { 
public: 
    S(const H& h): h_{h} {} 
private: 
    const H& h_; 
} 

Там нет никакого способа, я могу определить что-либо подобное

Service<ItsHandler<Service<....> 

Любая идея?

+0

Зачем вам шаблоны здесь? –

ответ

3

Как насчет абстрактных базовых классов и полиморфизма ?:

class baseHandler { 
public: 
    virtual func1() = 0; 
    virtual ~baseHandler() = 0; 
}; 

template <typename S> 
class H : public baseHandler { 
public: 
    H(const S& s): s_{s} {} 
private: 
    const S& s_; 
}; 

//template <typename H> 
class S { 
public: 
    S(const baseHandler& h): h_{h} {} 
private: 
    const baseHandler& h_; 
}; 
+1

Это экземпляр одного из самых важных сценариев Скотта Майерса «Aha!». моменты »] (http://www.artima.com/cppsource/top_cpp_aha_moments.html), в частности, связанный с пользовательским удалением Boost shared_ptr. – metal

+0

@metal: интересная серия статей, спасибо за ссылку – ted

+0

@ted: Будет делать что-то подобное, оценили. Приветствия. – ZeroCool

Смежные вопросы