Boost logo

Boost :

Subject: Re: [boost] [Variant] C++11 variadic template implementation
From: Larry Evans (cppljevans_at_[hidden])
Date: 2012-05-10 11:55:49


On 04/18/12 10:52, Larry Evans wrote:
> On 04/15/12 12:39, Larry Evans wrote:
>> On 04/15/12 04:57, Florian Goujeon wrote:
>>> Hi Boosters,
>>>
>>> I'd like to know if anybody were working on a C++11 version (using
>> variadic
>>>
>>> templates) of Boost.Variant.
>>>
>>> I currently use the 'classic' version in my project, but since I need
>>>
>>> more-than-20-type variants, the compilation take a lot of time
>>> (extending the
>>>
>>> number of types that variant can support forces you to disable the use of
>>>
>>> precompiled headers). Plus, I'll need to use 70 type variants (MPL lists
>>> are
>>>
>>> physically limited to 50 types).
> [snip]
>> There's this:
>>
>>
>> http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/pack/container_one_of_maybe.hpp
>>
>> which uses variadic templates; hence, doesn't have the limitations you
>> mentioned about the number of bounded types.
> [snip]
> OOPS. I failed to remember that container_one_of_maybe does use the
> proposed switch library, which includes:
>
> http://svn.boost.org/svn/boost/sandbox/switch/boost/control/switch.hpp
>
> which does have these code lines:
>
> #ifndef BOOST_SWITCH_LIMIT
> #define BOOST_SWITCH_LIMIT 50
> #endif
>
> #if BOOST_SWITCH_LIMIT > BOOST_PP_LIMIT_REPEAT
> #error BOOST_SWITCH_LIMIT exceeds Boost.Preprocessor limit
> #endif
> #if BOOST_SWITCH_LIMIT > BOOST_PP_LIMIT_ITERATION
> #error BOOST_SWITCH_LIMIT exceeds Boost.Preprocessor limit
> #endif
>
> which means container_one_of_maybe *does* have the limitations you were
> trying to avoid.
>
> Sorry for noise.
>
> I believe container_one_of_maybe could be modified to use the
> "static array of function pointers" method mentioned in another post
> to this thread, which was written by Paul Fultz:
>
> http://article.gmane.org/gmane.comp.lib.boost.devel/230073
>
> The only reason that method was not tried in container_one_of_maybe
> was for reasons cited in my reply to Paul's post.
>
> -regards,
> Larry

There's now an alternate implementation which uses the static array of
function pointers and therefore does not suffer the limitation imposed
by the BOOST_PP_LIMIT_* macros. You can switch between the two
implementations by #define'ing or #undef the macro:

  LAYOUT_DOMAIN_CONTAINER_PACK

This is used here:

http://svn.boost.org/svn/boost/sandbox/variadic_templates/boost/composite_storage/functor_indexed.hpp

When defined, the static array of function pointer is used; otherwise
the switch_ method is used.

It has been tested using:

http://svn.boost.org/svn/boost/sandbox/variadic_templates/libs/composite_storage/test/multiple_dispatch.cpp

HTH.

-regards,
Larry


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