我如何遍历非默认的构造类的提振MPL列表? [英] How do I loop over a boost MPL list of non-default constructed classes?
问题描述
我有下面的例子:
#include <iostream>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/list.hpp>
struct one {};
struct two {};
struct three {};
struct four {};
struct five { five() = delete; };
template <typename T>
void print()
{
std::cout << "hello " << typeid(T).name() << std::endl;
}
struct type_printer
{
template <typename T>
void operator()(T)
{
print<T>();
}
};
int main()
{
typedef boost::mpl::list<
one,
two,
three,
four,
five
>::type type_list;
boost::mpl::for_each<type_list>(type_printer());
}
如果我不包括在列表中的第五个对象,作品精绝,但一旦我做我得到以下错误:
Which works absolutely fine if I don't include the fifth object in the list, but once I do I get the following errors:
In file included from /usr/local/include/boost_1_56_0/boost/mpl/for_each.hpp:29:0,
from mpldef.cpp:3:
/usr/local/include/boost_1_56_0/boost/utility/value_init.hpp: In constructor ‘boost::initialized<T>::wrapper::wrapper() [with T = five]’:
/usr/local/include/boost_1_56_0/boost/utility/value_init.hpp:109:7: instantiated from ‘boost::initialized<T>::initialized() [with T = five]’
/usr/local/include/boost_1_56_0/boost/utility/value_init.hpp:205:12: instantiated from ‘boost::value_initialized<T>::value_initialized() [with T = five]’
/usr/local/include/boost_1_56_0/boost/mpl/for_each.hpp:81:9: recursively instantiated from ‘static void boost::mpl::aux::for_each_impl<false>::execute(Iterator*, LastIterator*, TransformFunc*, F) [with Iterator = boost::mpl::l_iter<boost::mpl::list4<two, three, four, five> >, LastIterator = boost::mpl::l_iter<boost::mpl::l_end>, TransformFunc = boost::mpl::identity<mpl_::na>, F = type_printer]’
/usr/local/include/boost_1_56_0/boost/mpl/for_each.hpp:81:9: instantiated from ‘static void boost::mpl::aux::for_each_impl<false>::execute(Iterator*, LastIterator*, TransformFunc*, F) [with Iterator = boost::mpl::l_iter<boost::mpl::list5<one, two, three, four, five> >, LastIterator = boost::mpl::l_iter<boost::mpl::l_end>, TransformFunc = boost::mpl::identity<mpl_::na>, F = type_printer]’
/usr/local/include/boost_1_56_0/boost/mpl/for_each.hpp:104:5: instantiated from ‘void boost::mpl::for_each(F, Sequence*, TransformOp*) [with Sequence = boost::mpl::list5<one, two, three, four, five>, TransformOp = boost::mpl::identity<mpl_::na>, F = type_printer]’
/usr/local/include/boost_1_56_0/boost/mpl/for_each.hpp:118:3: instantiated from ‘void boost::mpl::for_each(F, Sequence*) [with Sequence = boost::mpl::list5<one, two, three, four, five>, F = type_printer]’
mpldef.cpp:37:48: instantiated from here
/usr/local/include/boost_1_56_0/boost/utility/value_init.hpp:77:12: error: use of deleted function ‘five::five()’
mpldef.cpp:10:15: error: declared here
是否有这样做的方法吗?我试着删除 T
从 TYPE_PRINTER
电话运营商,所以它看起来是这样的:无效运算符()()
,我仍然得到了同样的错误。
Is there any way of doing this? I tried removing T
from the type_printer
call operator, so it looked something like this: void operator()()
and I still got the same error.
推荐答案
我加入一个类型的包装结构,像的在Boost.Hana看到一个。我说这在<一个发现了伟大的想法href=\"http://stackoverflow.com/questions/4053436/is-it-possible-to-iterate-an-mplvector-at-run-time-without-instantiating-the-t#comment7166228_4117003\">this即使用提到评论的boost :: MPL ::变换
来此包装类型添加到每个项目中的自动列表中。
I've solved this by adding a type wrapper struct, like the one seen in Boost.Hana. I added this to the great idea found in this comment that mentions using boost::mpl::transform
to add this wrapper type to each item in the list automatically.
下面详细介绍我的解决方法:
The following details my solution:
template <typename T>
struct type_
{
using type = T;
};
template <typename T>
struct add_type_wrapper
{
using type = type_<T>;
};
使用这两种新的,我改变了 TYPE_PRINTER
仿函数看起来像这样:
struct type_printer
{
template <typename T>
void operator()(T)
{
using type_t = typename T::type;
print<type_t>();
}
};
以及的boost :: MPL :: for_each的
主呼叫现在看起来是这样的:
And the boost::mpl::for_each
call in main now looks like this:
using boost::mpl::_1;
using wrapped_list = boost::mpl::transform<type_list, add_type_wrapper<_1>>::type;
boost::mpl::for_each<wrapped_list>(type_printer());
感谢您的帮助家伙,我认为这是一个非常好的和优雅的解决方案。
Thanks for your help guys, I think this is a really nice and elegant solution.
这篇关于我如何遍历非默认的构造类的提振MPL列表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!