Hi Joaquin!
Le 8 oct. 2014 à 20:57, Joaquin M Lopez Munoz
Akim Demaille
writes: /// Conversion to superclass. template <typename U> operator const poly_flyweight<U>&() const { const void* me = this; return *static_cast
(me); } Wow, this is totally verboten. The following problems lurk[...]
Thanks for the details, and the real case. Thanks also for prompting
me to dig deeper into the derived_poly_flyweight.
I think it now does what I want, if you're curious:
http://coliru.stacked-crooked.com/a/cacc6107cf22c2e6
I made several changes:
- I want to be able to dynamic_pointer_cast, so I added such
a function
- but so I also need to support null pointers, so I have added
support for nullptr and operator bool.
- because of this, I had to write specific hash_value and operator==
for poly_holder, otherwise the pointer gets dereferenced
(BTW, I think it's name is confusing, as in Boost.Flyweight
"holder" denotes something quite different).
- FWIW, your operator== for poly_flyweight was uselessly deep,
comparing the addresses should suffice (actually, shouldn't
Boost.Flyweight provide these operators itself? Is there any
possibility that something else would be wanted? I'm also
thinking about hashing here).
Here's the kind of things that works:
Bin e1 = bin('*',
bin('+', num(1), num(1)),
bin('+', num(1), num(1)));
ECHO(e1);
ECHO(e1->l);
Exp e2 = e1;
Exp e3(e1);
ECHO(e3);
ECHO(dynamic_pointer_cast