// { dg-do compile } // { dg-options "-O2" } namespace std { struct type_info { virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj, unsigned __outer) const; }; } template< typename VALUE_T, typename TYPE > struct List_policy { typedef VALUE_T *Value_type; typedef TYPE **Type; typedef TYPE *Head_type; typedef TYPE Item_type; }; template< typename POLICY > class List { public: typedef typename POLICY::Value_type Value_type; class Iterator { typedef typename POLICY::Type Internal_type; public: typedef typename POLICY::Value_type value_type; typedef typename POLICY::Value_type Value_type; Value_type operator -> () const { return static_cast<Value_type>(*_c); } Internal_type _c; }; Iterator begin() { return Iterator(); } Iterator end() { return Iterator(); } typename POLICY::Head_type _f; }; template<typename ELEM_TYPE> class H_list_item_t { }; template< typename T, typename POLICY > class H_list : public List<POLICY> { public: typedef typename POLICY::Item_type Item; typedef List<POLICY> Base; typedef typename Base::Iterator Iterator; Iterator insert(T *e, Iterator const &pred) { Item **x = &this->_f; *x = static_cast<Item*>(e); return Iterator(); } }; template< typename T > struct H_list_t : H_list<T, List_policy< T, H_list_item_t<T> > > { H_list_t(bool b) : H_list<T, List_policy< T, H_list_item_t<T> > >(b) {} }; template< typename BASE, typename MATCH_RESULT > struct Type_matcher : H_list_item_t<BASE> { explicit Type_matcher(std::type_info const *type); typedef MATCH_RESULT Match_result; private: std::type_info *_type; typedef H_list_t<BASE> List; typedef typename List::Iterator Iterator; static List _for_type; }; template< typename BASE, typename MR > Type_matcher<BASE, MR>::Type_matcher(std::type_info const *t) { Iterator c = _for_type.begin(); t->__do_catch(c->_type, 0, 0); _for_type.insert(static_cast<BASE*>(this), _for_type.begin()); } template< typename VI, typename HW > class Fa : public Type_matcher<Fa<VI, HW>, VI*> { public: typedef Fa<VI, HW> Self; virtual VI *do_match(HW *f) = 0; explicit Fa(std::type_info const *type) : Type_matcher<Self, VI*>(type) {} }; class Res {}; typedef Fa<Res, Res> R_fac; template< typename VI, typename HW_BASE, typename HW, typename BASE > class Fa_t : public BASE { public: Fa_t() : BASE(&typeid(HW)) {} VI *do_match(HW_BASE *) { return 0; } }; template< typename VI, typename HW > class Resource_factory_t : public Fa_t<VI, Res, HW, R_fac > {}; class Foo {}; class Foo2; class Foo3 : public Res {}; Resource_factory_t<Foo3, Foo> _x;