gpt4 book ai didi

c++ - 在数据结构中存储成员函数

转载 作者:太空宇宙 更新时间:2023-11-04 13:40:37 26 4
gpt4 key购买 nike

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

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

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

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

此时我需要的是:

  • Configuration类中定义成员函数来实现 Action
  • std::map等数据结构中注册这些成员函数

后一点对我来说很模糊。是否有一种可移植的方式来执行此操作?

还有一个类似问题的问题:Store Function Pointers to any Member Function .在这两种情况下,问题都可以用观察者模式来解决,但在我的例子中,这太过分了。我只需要一组非常小的函数。我宁愿不使用操作的基类污染我的代码,而是为所有需要特殊操作的参数子类化它。在这一点上,原始的 if/else if 会更可取。

最佳答案

您可以采用如下方法:

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

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

现在将您的 map 定义为:

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

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

关于c++ - 在数据结构中存储成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27777008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com