如何将 MPL 类型列表折叠到可变容器中?
How do I fold an MPL type list into a variadic container?
如果我有一个类型列表,我怎样才能得到一个带有该列表的类型,因为它是可变参数?
换句话说,我想从这里开始:
boost::mpl::list<foo, bar, baz, quux>
收件人:
types<foo, bar, baz, quux>
(顺序不重要)
这是我使用 fold
的尝试:
typedef boost::mpl::list<foo, bar, baz, quux> type_list;
template <typename... Ts>
struct types {};
template <template <typename... Ts> class List, typename T>
struct add_to_types {
typedef types<T, typename Ts...> type;
};
typedef boost::mpl::fold<
type_list,
types<>,
add_to_types<boost::mpl::_1, boost::mpl::_2>
>::type final_type;
不幸的是,这给了我有关占位符的错误:
error: type/value mismatch at argument 1 in template parameter list for 'template<template<class ... Ts> class List, class T> struct add_to_types'
error: expected a class template, got 'mpl_::_1 {aka mpl_::arg<1>}'
error: template argument 3 is invalid
error: expected initializer before 'final_type'
问题是 types<Ts...>
是 class 而不是 class 模板。但是,您的 add_to_types
需要 class 模板作为第一个参数。为了使 fold
表达式起作用,您可以将 add_to_types
更改为采用两个 class 参数,并针对第一个参数为 types<Ts...>
的情况专门化 add_to_types
:
template <typename Seq, typename T>
struct add_to_types;
template <typename T, typename... Ts>
struct add_to_types<types<Ts...>, T>
{
typedef types<T, Ts...> type;
};
如果我有一个类型列表,我怎样才能得到一个带有该列表的类型,因为它是可变参数?
换句话说,我想从这里开始:
boost::mpl::list<foo, bar, baz, quux>
收件人:
types<foo, bar, baz, quux>
(顺序不重要)
这是我使用 fold
的尝试:
typedef boost::mpl::list<foo, bar, baz, quux> type_list;
template <typename... Ts>
struct types {};
template <template <typename... Ts> class List, typename T>
struct add_to_types {
typedef types<T, typename Ts...> type;
};
typedef boost::mpl::fold<
type_list,
types<>,
add_to_types<boost::mpl::_1, boost::mpl::_2>
>::type final_type;
不幸的是,这给了我有关占位符的错误:
error: type/value mismatch at argument 1 in template parameter list for 'template<template<class ... Ts> class List, class T> struct add_to_types'
error: expected a class template, got 'mpl_::_1 {aka mpl_::arg<1>}'
error: template argument 3 is invalid
error: expected initializer before 'final_type'
问题是 types<Ts...>
是 class 而不是 class 模板。但是,您的 add_to_types
需要 class 模板作为第一个参数。为了使 fold
表达式起作用,您可以将 add_to_types
更改为采用两个 class 参数,并针对第一个参数为 types<Ts...>
的情况专门化 add_to_types
:
template <typename Seq, typename T>
struct add_to_types;
template <typename T, typename... Ts>
struct add_to_types<types<Ts...>, T>
{
typedef types<T, Ts...> type;
};