如何在运行时在boost::fusion::vector中查找元素
How to find an element in a boost::fusion::vector at runtime?
我这里有一个通用状态机的专有实现,它使用std::tr1::tuple
作为转换表:
template<State StartState, Event TriggerEvent, State TargetState>
struct transition {...};
typedef std::tr1::tuple< transition< ready , run , running >
, transition< running , terminate, terminating >
, transition< terminating, finish , terminated >
> transition_table;
有一个功能
template<typename Transitions>
State find_next_state( State current
, Event event
, const Transitions& transition_table );
在给定当前状态和事件的情况下,在转换表中查找下一个状态。
除了这个平台的tuple
实现不支持超过10个项目之外,这一切都很好。boost::tuple
似乎也是如此,所以我尝试使用boost::fusion::vector
。但fusion的find_if
似乎只采用"一元MPL-Lambda表达式"——我想,它只在编译时起作用。
既然如此,我该如何实现find_next_state()
呢?
注意:
这是一个专有的嵌入式平台,只提供GCC 4.1.2,所以我们只能使用C++03+TR1。
编写自己的find_if
非常简单,除了"返回找到的值"部分。由于boost::fusion::vector
是一个异构容器,因此没有一个正确的类型可以返回。脑海中出现的一个可能的解决方案是接受一个用找到的值调用的延续函数:
#include <boost/fusion/include/size.hpp>
#include <boost/fusion/include/at_c.hpp>
// private implementation details
namespace detail{
// shorthand ...
template<class S>
struct fusion_size{
static const unsigned value =
boost::fusion::result_of::size<S>::type::value;
};
// classic compile-time counter
template<unsigned> struct uint_{};
template<class Seq, class Pred, class F>
void find_if(Seq&, Pred const&, F, uint_<fusion_size<Seq>::value>, int)
{ /* reached the end, do nothing */ }
template<class Seq, class Pred, class F, unsigned I>
void find_if(Seq& s, Pred const& pred, F f, uint_<I>, long){
if(pred(boost::fusion::at_c<I>(s)))
{
f(boost::fusion::at_c<I>(s));
return; // bail as soon as we find it
}
find_if(s, pred, f, uint_<I+1>(), 0);
}
} // detail::
template<class Seq, class Pred, class F>
void find_if(Seq& s, Pred const& pred, F f){
detail::find_if(s, pred, f, detail::uint_<0>(), 0);
}
活生生的例子。
当I+1
==fusion_size<Seq>::value
时,int
和long
参数以及0
参数只是为了消除歧义,因为这两个函数都同样可行。CCD_ 14是类型CCD_。
相关文章:
- 在对向量中查找元素的索引
- 在链接列表中查找元素 - C++
- 在数组中查找元素,如果找到则返回Find,否则返回not Find
- 在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
- 用于查找元素的数据结构
- 为什么在查找元素时需要使用 set.find(x) != set.end()
- 在二叉搜索树中查找元素
- 二进制搜索不变以查找元素的首次出现
- 迭代列表以查找元素的出现.代码问题
- 从单链接列表(从尾部)中查找元素
- iMacro 查找元素
- 在向量数组中查找元素
- 如何在二叉搜索树中查找元素
- 如何在字符右侧的QString中查找元素
- 在Vector中查找元素对
- 如何在运行时在boost::fusion::vector中查找元素
- 在 stl 堆栈 cpp 中查找元素
- 在向量中查找元素并将其删除
- 如何在动态数组中查找元素的数量
- 在数组中查找元素,然后使用指针进行交换