【问题标题】:Storing member functions in a data structure在数据结构中存储成员函数
【发布时间】:2015-01-05 09:53:58
【问题描述】:

我有一个类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

现在,这很丑陋,并且使类的可扩展性比我希望的要低(假设将来我可能想要存储浮点以外的其他参数)。所以我想我可以存储第二个包含键-动作对的映射,其中每个键都有一个必须执行的相应附加动作,存储为函数指针。那么设置器的伪代码将是:

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 会更可取。

【问题讨论】:

    标签: c++ function-pointers


    【解决方案1】:

    您可以采取如下方法:

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

    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 代码应该更易于管理..

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 2016-02-23
      • 1970-01-01
      • 2019-04-15
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多