$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Larry Evans (cppljevans_at_[hidden])
Date: 2007-05-14 15:32:40
Query:
The code here:
http://boost-consulting.com/vault/index.php?&directory=variadic_templates
in:
aligned_types.2.zip(tr1/aligned_types.hpp)
would seem to fit best in boost's type_traits, in particular, with
those templates described here:
http://www.boost.org/doc/html/boost_typetraits/category.html#boost_typetraits.alignment
Is there any interest in adding the aligned_types code there?
Brief Description:
The aligned_types template declaration is:
template<class Tag, typename... Types> struct aligned_types;
where:
Tag is the "layout tag". Currently the only such tags are:
variant
tuple
packed
Types is a sequence of types (much like the current variant and boost
sequences)
and where the resulting nested type:
aligned_types<Tag,Types...>::type
is simply an instance of aligned_storage with sufficient memory to
accommodate Types... in a layout specificed by Tag. For example,
with Tag==variant, the aligned_storage is the same as that for
the aligned_union<0,Types...> of:
http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n2140.pdf
The other tags are for regular structs(tag=tuple) and packed
structs(tag=packed).
WARNING-Needs Variadic Template Compiler:
The code uses Gregor's variadic template compiler:
http://www.osl.iu.edu/~dgregor/cpp/variadic-templates.html
hence, it can't be used with any other compiler. However, I'd
think it could be converted to use the preprocessor methods used
by much of boost::mpl and boost::fusion to approximate Gregor's
variadic templates.
Applications:
Reuse in boost::variant:
Around line 215 of:
http://boost.cvs.sourceforge.net/boost/boost/boost/variant/variant.hpp?revision=1.97&view=markup
there's make_storage whose nested type, is, AFAICT, the same as
aligned_types<variant,Types...>::type. The one difference is that
make_storage (from looking just at lines 233-235) calculates the
alignment of the variant and the max of the individual
alignements. However, as explained in:
aligned_types.2.zip(libs/tr1/doc/aligned_struct_offsets.txt)
least-common-multiple instead of max is needed to handle extended
alignments.
Thus, aligned_types<variant,Types...> could be used in place of
the current variant's make_storage.
Space efficient tuple without preprocessor:
By using aligned_types<tuple,Types...>::type as a storage buffer
for a tuple, and using the mpl::at_c specializations in
aligned_types.2.zip(tr1/aligned_types.hpp) to access the subparts
of this storage buffer corresponding to an element in Types..., a
tuple implementation as space efficient as fusion's could be
achieved without use of the boost preprocessor library.