From: David Abrahams (dave_at_[hidden])
Date: 2003-02-24 16:40:10
"Philippe A. Bouchard" <philippeb_at_[hidden]> writes:
>> 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.
And if the object's constructor throws an exception, what then?
> - 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> >
> 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.
You're really a fiend for low-level optimizations, aren't you?
-- Dave Abrahams Boost Consulting www.boost-consulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk