Boost logo

Boost :

Subject: Re: [boost] [optional] generates unnessesary code for trivial types
From: Hite, Christopher (Christopher.Hite_at_[hidden])
Date: 2012-02-13 09:10:05


> On 1.2.2012. 17:53, Hite, Christopher wrote:
> > As for the debugger the new C++ allows for a union to contain a
> > class. So if a placeholder implemention using such a union would show the data in debug.

> But the pointer approach would also work with "real world" compilers
> ;)

This isn't for science fiction. Gcc says they support n2544 since 4.6.
http://gcc.gnu.org/projects/cxx0x.html
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2544.pdf

I just tried it out:

template<typename T>
union placeholder{
        T v;
        placeholder() {}
        ~placeholder (){}
};
...

        placeholder<std::string> ps;
        std::string s("hi");
        new(&ps.v) std::string(s);

< Uninited happens to contain null. >
(gdb) print ps
$2 = {v = {static npos = 18446744073709551615,
    _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x0}}}

< Initied: >
(gdb) print ps
$3 = {v = {static npos = 18446744073709551615,
    _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x602028 "hi"}}}

I don't know what platform you're using, but it seems completely reasonable to #ifdef a version of the placeholder in that does this so people can debug easily.

Does that remove the main reason you wanted a pointer?

BTW I did look at your code some. The deconstructor mixin, it's the same technique I used! For the ctor I just define a intermediate class with either default copy and operator= or impled ones.

Chris


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk