这个问题在这里已有答案:
所以,我以为我已经理解了成员函数指针和std :: fuction,但遗憾的是,情况并非如此 .
我有以下代码 - 它是状态机的一些早期部分,但我正在努力 . 让我粘贴代码:
#include <iostream>
#include <functional>
#include <map>
//forward decls
class state_t;
enum event_t
{
ev_start = 0,
ev_middle,
ev_end
};
struct transition_t
{
//std::function<bool()> guard_function();
std::function<bool()> guard_function;
state_t *p_next_state;
};
class state_t
{
public:
std::map<event_t, transition_t> transitions;
bool some_guard()
{
std::cout << "check the guard condition - all is well" << std::endl;
return true;
}
};
int main()
{
std::cout << "Hello World!" << std::endl;
state_t s1;
state_t s2;
// Setup transitions
s1.transitions[event_t::ev_start] = transition_t{s1::some_guard, &s2};
s1.transitions[event_t::ev_middle] = transition_t{nullptr, &s2}; // no guard
event_t test_event = event_t::ev_start;
auto trans = s1.transitions.find(event_t::ev_start);
if (trans != s1.transitions.end())
{
// change state - TBD
std::cout << "changingn state" << std::endl;
}
return 0;
}
好的,所以:
-
event_t
只是一些枚举 -
transition_t
意味着包含一个指向某个保护函数的指针,该函数返回一个bool和一个指向下一个状态的指针 . -
state_t
有一个事件和转换的映射,并包含一些可以存储在transition_t中的保护函数 .
所以在main()中我试图构建一些状态......
s1.transitions[event_t::ev_start] = transition_t{s1::some_guard, &s2}; // <--- this line fails
s1.transitions[event_t::ev_middle] = transition_t{nullptr, &s2}; // <--- this line works (not so surprised)
但我无法弄清楚如何对此进行排序 . 我过去用lambda和模板做过这个...但我真的想给std :: function一个去看看它是否更好/更容易......
任何指针/指南在这里做什么都会受欢迎,即使它使用lambdas :),但我宁愿让std :: function工作
1 回答
这应该工作,因为您需要将成员函数绑定到它是实例 .
感谢下面的@Barry评论,使用lambda解决方案比使用bind更好
我发现bind和lambda的一些性能线程 . std::bind vs lambda performance
lambda函数看起来也更容易阅读 .