Boost logo

Boost :

From: Philippe A. Bouchard (philippeb_at_[hidden])
Date: 2003-02-24 15:45:15


David Abrahams wrote:
> "Philippe A. Bouchard" <philippeb_at_[hidden]> writes:
>
>> Yes, exactly. Sorry if I wasn't precise enough.
>>
>> The bool type will cancel type_with_alignment<> effects (at least on
>> Intel compatible platforms); i.e. unique alignment of each
>> optional<T> type.
>
> Sounds like you want
>
> type_with_alignment<T>::type storage;
> new ((void*)&storage) T(x, y, z)
>
> Can you really do anything to make this cleaner? I guess:
>
> aligned_storage<T> storage;
> new (storage.bytes) T(x, y, z);
>
> might be a help. What else are you gaining? And how do you destroy
> the T? If not explicitly and you don't have a "constructed" flag,
> you're going to have exception-safety problems.

Everything seems already defined ;)

Given the fact optional<>::m_storage is aligned like a bool...:

- Maybe aligned_storage<> should always destruct its object. It would be
the user's responsability to construct the object before its destruction,
otherwise the result would be undefined.

- Maybe we could create 2 separate type lists if optional<> is used many
times in the same object, gathering m_initialized types and m_storage in
separate lists:

struct A
{
    optional<char> i; // bool alignment
    optional<short> l; // bool alignment
    optional<double> d; // bool alignment
};

Could be transformed into:

struct A
{
    typedef optional_typelist< typelist<char, short, double> >
optional_members;
    typedef array<bool, optional_members::size> optional_inits;

    optional_inits init; // Array of booleans
    optional_members storage; // Typelist storage
};

In this example, optional_typelist<T1, T2, T3, ...> would be a list of
optional<T1>, optional<T2>, optional<T3>, ...

It could be simplified even more, but this is just a suggestion.

Philippe A. Bouchard


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