How to "concatenate" boost::mpl::vectors
Asked Answered
S

3

8

I have to different vectors

mpl::vector<Type1, Type2...>
mpl::vector<Type3, Type4...>

I'd like to "concatenate" them to form:

mpl::vector<Type1, Type2, Type3, Type4...>

This would allow me to prepare vector templates and reuse them afterwards. There are different solutions to my problem, but this approach seems most appropriate to me.

Thanks...

Scaffolding answered 24/10, 2013 at 19:36 Comment(0)
S
7

The libaray native supported function boost::mpl::joint_view is probably a better choice. It is optimized and lazy-evaluated.

http://www.boost.org/doc/libs/1_55_0/libs/mpl/doc/refmanual/joint-view.html

Soriano answered 18/11, 2013 at 14:41 Comment(1)
Works like charm! And it does not explode the virtual memory, required for compilation. Thank you very much!Scaffolding
M
3

Like this:

// include the appropriate headers
typedef mpl::vector<Type1, Type2> first_type;
typedef mpl::vector<Type3, Type4> second_type;
typedef mpl::copy<first_type::type, mpl::back_inserter<second_type> >::type concat_type;
Meltwater answered 24/10, 2013 at 19:54 Comment(4)
I'm not sure, but I think that first_type and second_type are switched. If I'm not wrong with that you'll get vector<Type3,Type4,Type1,Type2>.Cabin
@cv_and_he Right, I just didn't give importance to the types' order.Meltwater
Thanks, this code does the job. Though in my case this method consumes a huge amount of memory at compile time...Scaffolding
@Scaffolding well, template metaprogramming requires a lot of ct-resources, especially with MSVC.Meltwater
M
2

You can use mpl::copy, which uses mpl::fold internally.

typedef mpl::vector<T0, T1> s0;
typedef mpl::vector<T2, T3> s1;
typedef mpl::copy<
    s1,
    mpl::back_inserter<s0>
>::type concatenated;

BOOST_MPL_ASSERT((
    mpl::equal<
        concatenated,
        mpl::vector<T0, T1, T2, T3>
    >
));
Moujik answered 25/10, 2013 at 12:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.