繁体   English   中英

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

[英]Storing member functions in a data structure

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

请注意,用户是我。 这只是我的框架在内部使用的辅助类,并且不会暴露给用户。

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

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

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

后一点对我来说很模糊。 有便携式的方法吗?

还有一个类似的问题:将函数指针存储到任何成员函数 在这两种情况下,都可以使用“观察者”模式解决该问题,但是在我的情况下,这太过分了。 我需要的只是一组非常小的功能。 我宁愿不要使用动作的基类来污染我的代码,而不要将其子类化为需要特殊动作的所有参数。 到那时,原始的if / else if将会更可取。

您可以采用以下方法:

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

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以支持它,所需的粘合代码应更易于管理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM