gpt4 book ai didi

c++ - 有没有办法突破 boost::mpl for_each?

转载 作者:可可西里 更新时间:2023-11-01 16:05:56 24 4
gpt4 key购买 nike

真的很简单的问题,让我介绍一下背景:

我有一个 mpl::vector 类型,其中每个类型都有一个 id,在运行时我使用 mpl::for_each 遍历这个 vector 并找到给定 id 的匹配类型。但是一旦找到,继续循环就没有意义了,所以 - 问题是,有没有办法跳出它(不抛出异常)?

最佳答案

为了实现类似 find_if 的功能,我更改了 for_each(将其称为 exec_if)以采用 bool 模板参数。 bool 指示是否应该执行下一个序列,或者影响提前返回。

#include <iostream>

#include <boost/mpl/vector.hpp>
#include <boost/mpl/is_sequence.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/next_prior.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/assert.hpp>

namespace mpl = boost::mpl;

template< bool done = true >
struct exec_if_impl
{
template<typename Iterator, typename LastIterator, typename Pred, typename Exec>
static void execute(Iterator*, LastIterator*, Pred const&, Exec const&)
{
}
};

template<>
struct exec_if_impl<false>
{
template<typename Iterator, typename LastIterator, typename Pred, typename Exec>
static void execute(Iterator*, LastIterator*, Pred const& f, Exec const& e)
{
typedef typename mpl::deref<Iterator>::type item;

if (!f(static_cast<item*>(0)))
{
typedef typename mpl::next<Iterator>::type iter;
exec_if_impl<boost::is_same<iter, LastIterator>::value>
::execute(static_cast<iter*>(0), static_cast<LastIterator*>(0), f, e);
}
else
e(static_cast<item*>(0));
}
};

template<typename Sequence, typename Pred, typename Exec>
inline
void exec_if(Pred const& f, Exec const& e, Sequence* = 0)
{
BOOST_MPL_ASSERT(( mpl::is_sequence<Sequence> ));

typedef typename mpl::begin<Sequence>::type first;
typedef typename mpl::end<Sequence>::type last;

exec_if_impl<boost::is_same<first,last>::value>
::execute(static_cast<first*>(0), static_cast<last*>(0), f, e);
}

namespace msg
{
struct m1 { enum { TYPE = 1 }; static const char* name() { return "m1"; } };
struct m2 { enum { TYPE = 2 }; static const char* name() { return "m2"; } };
struct m3 { enum { TYPE = 3 }; static const char* name() { return "m3"; } };
struct m4 { enum { TYPE = 4 }; static const char* name() { return "m4"; } };
struct m5 { enum { TYPE = 5 }; static const char* name() { return "m5"; } };
}

struct checker
{
checker(int chk_type) : type(chk_type) {}

template <typename Mtype>
bool operator()(Mtype* = 0) const
{
return Mtype::TYPE == type;
}

int type;
};

struct exec
{
template <typename Mtype>
void operator()(Mtype* = 0) const
{
std::cout << Mtype::name() << " executed" << std::endl;
}
};

int main(void)
{
typedef mpl::vector<msg::m1, msg::m2, msg::m3, msg::m4, msg::m5> mseq;

checker chk(3);

exec_if<mseq>(chk, exec());

return 0;
}

我将其更改为 exec_if,因此现在当谓词匹配时,将使用该类型触发要执行的仿函数 - 这正是我需要的。

关于c++ - 有没有办法突破 boost::mpl for_each?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4798169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com