假设我有以下课程......
class foo
{
private:
void bar(int, int);
void bar2(int, float);
void bar3();
void callOne(int message);
};
我想说我想根据callOne()
参数的值在message
中调用其中一个函数。假设0个电话bar()
,1个电话bar1()
和2个电话bar2()
。我知道这里的简单方法是使用switch
,但在实际实现中我觉得这可能会变得混乱,因为我将有更多的功能。这基本上是我的后退实施。
有没有办法使用函数指针,lamdbas等可以说,"嘿,我给你这个消息。基于该消息调用特定功能。"?我基本上都在寻找一种基于消息查找函数(可能是字典)并调用它的方法。
答案 0 :(得分:9)
唯一的方法是使用某种存储函数的数据结构(可能是std::function
),它将消息名称映射到已注册的函数。无论是std::map
,std::unordered_map
,boost::container::flat_map
还是您自己设计的地图,它都必须是这样的。
至于签名问题,您可以简单地拥有固定(小)数量的签名。在内部,您可以存储不同的地图,只需搜索每种类型的相应功能。或者,您可以让地图存储各种参数类型的boost::variant
个函数,使用访问者根据需要将调出场转换为正确的类型。
如果你需要支持调用任何带有任意数量参数的函数,那通常是不可能的。至少,不是直接的。对于消息处理系统,我通常更喜欢使用boost::any
。所有消息功能都需要any
,发送消息的人员会提供消息。发送方和接收方知道该参数应该是什么,因此接收方可以做一个正确的any_cast
将其转换为正确的类型。如果存在误传,你会得到一个很好的例外。