//Purpose: // Demonstrate what compute_bases does. // //#define TRACE_INDENTED_CONCEPT_INTERFACE #include #include #include #include namespace mpl = boost::mpl; using namespace boost::type_erasure; template struct simple { static void apply ( C const& cont ) { ::boost::trace_scope ts ( ::utility::demangled_type_name >()+"::"+__FUNCTION__+"(C const&)" ); std::cout <<":type_name="<<::utility::demangled_type_name() <<":cont="< struct requirements { typedef mpl::vector < destructible , simple > type ; }; namespace boost { namespace type_erasure { template < class C , class Base > struct concept_interface < ::simple , Base , C > : Base { typedef ::simple concept_t; concept_interface() { ::boost::trace_scope ts("compute_bases.cpp:concept_interface,Base,C>::CTOR()"); std::cout<<":concept_t="<<::utility::demangled_type_name()<<"\n"; std::cout<<":Base="<<::utility::demangled_type_name()<<"\n"; } void simple() { ::boost::trace_scope ts("compute_bases.cpp:concept_interface,Base,C>::simple()"); std::cout<<"***right simple interface***\n"; ::simple a_simple; call(a_simple, *this); } }; //#define OVERLOAD_SIMPLE #ifdef OVERLOAD_SIMPLE template < class C , class Base > struct concept_interface < typename requirements::type , Base , C > : Base { typedef typename requirements::type concept_t; concept_interface() { ::boost::trace_scope ts("compute_bases.cpp:concept_interface::type,Base,C>::concept_CTOR()"); std::cout<<":concept_t="<<::utility::demangled_type_name()<<"\n"; std::cout<<":Base="<<::utility::demangled_type_name()<<"\n"; } void simple() { ::boost::trace_scope ts("compute_bases.cpp:concept_interface::type,Base,C>::simple()"); std::cout<<"***wrong simple interface***\n"; } }; #endif } } typedef requirements<_self>::type requirements_t ; typedef detail::compute_bases < any , requirements_t , _self >::type computed_bases_t ; int main() { ::boost::iostreams::indent_scoped_ostreambuf<> indent_cout(std::cout); #ifdef TRACE_INDENTED_CONCEPT_INTERFACE std::cout<<":concept_interfaces=\n"; trace_indented_concept_interface::_(); #else std::cout<<":computed_bases_t=\n " <<::utility::demangled_type_name()<<"\n"; #endif any a_any(int(999)); a_any.simple(); return 0; }