3

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

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()。我知道这里最简单的方法是使用 a switch,但在实际实现中我觉得这可能会变得混乱,因为我会有更多的功能。这基本上是我的后备实现。

有没有一种方法可以使用函数指针、lamdbas 等可以说:“嘿,我给你这个消息。根据那个消息调用一个特定的函数。”?我基本上是在寻找一种基于消息查找函数(可能在字典中)并调用它的方法。

4

1 回答 1

9

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

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

如果您需要支持调用任何带有任意数量参数的函数,那通常是不可能的。至少,不是直接的。对于消息处理系统,我通常更喜欢使用boost::any. 所有消息函数都带有一个any,发送消息的人随消息一起提供一个。发送者和接收者知道参数应该是什么,所以接收者可以做一个适当any_cast的把它转换成正确的类型。如果有沟通不畅,你会得到一个很好的例外。

于 2013-07-26T04:25:31.887 回答