gpt4 book ai didi

c++ - 实现信号(观察者模式): is mutable or const_cast necessary?

转载 作者:IT老高 更新时间:2023-10-28 23:18:19 30 4
gpt4 key购买 nike

我正在实现我自己的 signal/slot(观察者模式,Qt 风格)机制,所以我可以有一个 property 来通知......东西......那是改变了。

我认为 C++11 提供了使非常简洁和功能强大的实现成为可能所需的一切。我遇到的“问题”是如果我想“连接”到 const 对象的信号,我需要 signal::connect 函数是 const ,但修改回调/观察者列表。有两种直接的方法可以解决此问题:

  1. const_cast connect 内的列表。
  2. 使列表可变

在我看来,两者都是一样的(在 this question 中,e.g. 之前有人问过这个问题),并且在逻辑上非常好,但在风格上是有问题的。因此问题。有没有办法解决这个问题,或者这是对 const_cast/mutable 的真正合理使用?

我现在拥有的一些初步代码:

template<typename... ArgTypes>
class signal
{
public:
template<typename Callable>
void connect(Callable&& callback) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
slots.emplace_back(callback);
}

void emit(ArgTypes... arguments) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
for(auto&& callback : slots)
{
callback(arguments...);
}
}

private:
// mutable here allows to connect to a const object's signals
mutable std::vector<std::function<void(ArgTypes...)>> slots;
std::mutex slots_mutex;

};

注意我没有测试过这段代码;这只是我目前心态的反射(reflect)。

最佳答案

对于这种情况,

mutable 通常是更好的选择。

尽可能避免 (const) 强制转换,它很容易遇到未定义的行为,而 mutable 保证不会1)


1 mutable 类成员保证不会转到例如发出的代码 .text 段。

关于c++ - 实现信号(观察者模式): is mutable or const_cast necessary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39182501/

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