将成员函数存储在数据结构中

时间:2015-01-05 09:53:58

标签: c++ function-pointers

我有一个类Configuration在映射中将一些浮点参数作为键值对(键是字符串)。 用户可以使用成员函数Configuration::set(string, float)设置参数,并使用相应的getter函数检索值。

作为评论,用户就是我。这只是我的框架在内部使用的一个辅助类,不会向用户公开。

棘手的部分是,对于其中一些参数,setter函数不仅要将键值对添加到地图中,还要执行其他简单操作。例如,当用户设置参数“dt”时,该方法还应计算并将参数“dtr”设置为dtr = 1.f / dt。这种情况只发生在少量参数上,绝大多数都不需要任何特殊操作。

需要特殊操作的参数事先已知,可以安全地进行硬编码。从理论上讲,set函数可以有这样的实现(伪代码):

set(key, value):
    values.store(key, value)

    if key == "dt"
         values.store("dtr", 1/dt)
    else if key == "..."
         ...
    else if ...
         ...
    endif
end set

现在,这非常难看,并且使得类的可扩展性低于我希望的程度(假设将来我可能希望存储除浮点之外的其他参数)。所以我认为我可以存储第二个映射,其中包含键 - 动作对,每个键都有一个必须执行的相应附加操作,存储为函数指针。那么setter的伪代码就是:

set(key, value):
    values.store(key, value)

    if key in actions
        actions[key](value)
    endif
end set

此时我需要的是:

  • Configuration类中定义成员函数以执行操作
  • std::map
  • 等数据结构中注册这些成员函数

后一点对我来说非常模糊。有可行的方法吗?

还有一个类似问题的问题:Store Function Pointers to any Member Function。在这两种情况下,问题都可以通过观察者模式来解决,但在我的情况下,这是非常矫枉过正的。我只需要一组非常小的功能。我不希望用操作的基类来污染我的代码,而是将它子类化为需要特殊操作的所有参数。那时原来的if / else if会更好。

1 个答案:

答案 0 :(得分:0)

您可以采取以下方法:

首先定义一个可变量类型来保存,例如:

typedef boost::variant<int, float, double> value_type;

现在将地图定义为:

typedef std::map<std::string, std::pair<value_type, std::function<void(const value_type&)>> map_type;

现在,当您有新类型时,展开value_type以支持它,所需的 glue 代码应该更易于管理..