|
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