根据消息调用函数

时间:2013-07-26 04:18:57

标签: c++ function c++11

假设我有以下课程......

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等可以说,"嘿,我给你这个消息。基于该消息调用特定功能。"?我基本上都在寻找一种基于消息查找函数(可能是字典)并调用它的方法。

1 个答案:

答案 0 :(得分:9)

唯一的方法是使用某种存储函数的数据结构(可能是std::function),它将消息名称映射到已注册的函数。无论是std::mapstd::unordered_mapboost::container::flat_map还是您自己设计的地图,它都必须是这样的。

至于签名问题,您可以简单地拥有固定(小)数量的签名。在内部,您可以存储不同的地图,只需搜索每种类型的相应功能。或者,您可以让地图存储各种参数类型的boost::variant个函数,使用访问者根据需要将调出场转换为正确的类型。

如果你需要支持调用任何带有任意数量参数的函数,那通常是不可能的。至少,不是直接的。对于消息处理系统,我通常更喜欢使用boost::any。所有消息功能都需要any,发送消息的人员会提供消息。发送方和接收方知道该参数应该是什么,因此接收方可以做一个正确的any_cast将其转换为正确的类型。如果存在误传,你会得到一个很好的例外。