[type_erasure] any holding a ref to any

Say I have an object a of type any<mpl::vector<Concept1,typeid_<>>,_self&> and an object b of type any<Concept2,T> where Concept1 is a subconcept of Concept2. Is it possible to make a refer to b rather than the object wrapped by b? I mean: any_cast<void*>(&a)==&b typeid_of(a)==typeid(b) A solution involving wrapping/copying b into some auxiliary entity would be acceptable too. This questin is obviously connected to the implementation of boost::any_collection, as Steven will undoubtedly have guessed. Thank you, Joaquín M López Muñoz

AMDG On 05/31/2017 03:25 AM, Joaquin M López Muñoz via Boost-users wrote:
Say I have an object a of type
any<mpl::vector<Concept1,typeid_<>>,_self&>
and an object b of type
any<Concept2,T>
where Concept1 is a subconcept of Concept2. Is it possible to make a refer to b rather than the object wrapped by b? I mean:
any_cast<void*>(&a)==&b typeid_of(a)==typeid(b)
A solution involving wrapping/copying b into some auxiliary entity would be acceptable too. This questin is obviously connected to the implementation of boost::any_collection, as Steven will undoubtedly have guessed.
You can do this using the (internal, undocumented) constructor any(detail::storage, const binding&); which effectively lets you pass a void* and and and vtable. With the public API, you need an auxiliary concept like this: #include <boost/type_erasure/any.hpp> #include <boost/type_erasure/builtin.hpp> #include <boost/type_erasure/operators.hpp> #include <boost/mpl/vector.hpp> #include <boost/mpl/map.hpp> #include <iostream> using namespace boost::type_erasure; namespace mpl = boost::mpl; typedef mpl::vector<copy_constructible<>, ostreamable<> > test_concept; template<class P, class T> struct make_reference { static P& apply(T& t) { return t; } }; int main() { any<test_concept> x(42); using extra_concept = mpl::vector<make_reference<_self, any<test_concept> > >; binding<extra_concept> b1 = make_binding<mpl::map<mpl::pair<_self, any<test_concept> > > >(); binding<mpl::vector<test_concept, typeid_<> > > b2 = make_binding<mpl::map<mpl::pair<_self, any<test_concept> > > >(); any<mpl::vector<test_concept, typeid_<> >, _self&> ref( call(b1, make_reference<_self, any<test_concept> >(), x), b2); std::cout << ref << std::endl; } In Christ, Steven Watanabe
participants (2)
-
Joaquin M López Muñoz
-
Steven Watanabe