如何循环遍历boost::mpl::list?

9

这是我目前为止所做的,

#include <boost/mpl/list.hpp>
#include <algorithm>
namespace mpl = boost::mpl;

class RunAround {};
class HopUpAndDown {};
class Sleep {};

template<typename Instructions> int doThis();
template<> int doThis<RunAround>()    { /* run run run.. */ return 3; }
template<> int doThis<HopUpAndDown>() { /* hop hop hop.. */ return 2; }
template<> int doThis<Sleep>()        { /* zzz.. */ return -2; }


int main()
{
    typedef mpl::list<RunAround, HopUpAndDown, Sleep> acts;

//  std::for_each(mpl::begin<acts>::type, mpl::end<acts>::type, doThis<????>);

    return 0;
};

我该如何完成这个任务?(我不确定是否应该使用 std::for_each,只是根据其他答案猜测的)
1个回答

14

使用mpl::for_each可以在类型列表上进行运行时迭代。例如:

struct do_this_wrapper {
    template<typename U> void operator()(U) {
        doThis<U>();
    }
};

int main() {
    typedef boost::mpl::list<RunAround, HopUpAndDown, Sleep> acts;
    boost::mpl::for_each<acts>(do_this_wrapper());    
};

1
谢谢,有没有使用boost::bind而不是包装对象来完成这个的方法? - Kyle
2
@Kyle:我不这么认为——我不知道Boost.Bind中是否有任何实用程序可以生成具有模板化operator()的所需函数对象。 - Georg Fritzsche
@GeorgFritzsche: 有没有办法将 do_this_wrapper 变成一个lambda表达式(在C++11/14/17中)? - Adi Shavit
1
@AdiShavit 这应该可以通过C++14的通用lambda表达式实现。 - Georg Fritzsche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接