如何从mpl :: vector实例化模板

时间:2015-01-29 04:54:28

标签: c++ variadic-templates boost-mpl

我有一个mpl :: vector&想要使用矢量元素作为模板参数来实例化模板。这是怎么做到的?可以使用参数包来合并额外的mpl :: vector元素吗?

例如:

struct A; struct B; struct C; struct D;

using args = mpl::vector<A, B, C, D>;

template<typename argA, typename argB, typename argC...>
struct derived_type;

using type_from_vector = derived_type<args>;

接近这样的事情的最佳方式是什么?

感谢。

2 个答案:

答案 0 :(得分:5)

[完全披露:我是Boost.Hana的开发者]

我知道这个问题是关于Boost.MPL的,但让我用Boost.Hana回答 库(仍处于开发阶段)。如果您正在使用最近的Clang,那么 可能想试试这个图书馆;它可以做Boost.MPL可以做的一切 做,但它努力使它减少痛苦。你走了:

#include <boost/hana/type_list.hpp>
#include <boost/hana/type.hpp>
#include <type_traits>
namespace hana = boost::hana;

struct A; struct B; struct C; struct D;
constexpr auto args = hana::type_list<A, B, C, D>;

template<typename argA, typename argB, typename ...argC>
struct derived_type;

using type_from_vector = decltype(
    hana::unpack(args, hana::template_<derived_type>)
)::type;

static_assert(std::is_same<
    type_from_vector,
    derived_type<A, B, C, D>
>{}, "");

答案 1 :(得分:3)

您可以使用boost::mpl::foldstd::make_index_sequence

这两段代码片段都假定为using namespace boost::mpl;

使用boost::mpl::fold

template <typename TList, typename T> struct ExtendTList;
template<typename T, typename... Ts>
struct ExtendTList<derived_type<Ts...>, T>
{
  using type = derived_type<Ts..., T>;
};

using type_from_vector = fold<args, derived_type<>, ExtendTList<_1, _2>>::type;

使用std::make_index_sequence

template <typename V, template<typename...> T, typename Seq>
struct MakeFromTypesAtIndices;
template <typename V, template<typename...> T, size_t ... Indices>
struct MakeFromTypesAtIndices<V, T, std::integer_sequence<size_t, Indices...>>
{
  using type = T< at<V, Indices>... >;
};

using type_from_vector = MakeFromTypesAtIndices<args, derived_type, std::make_index_sequence<size<args>::value>>::type;