Boost logo

Boost Users :

Subject: Re: [Boost-users] [type_erasure] any holding a ref to any
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2017-05-31 14:43:40


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

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at