绑定类函数观测器c++11
bind class function observer c++11
我正在尝试扩展主题观察器模式,以从类中获取函数,而不是静态函数。我在简单观察者模式c++11中学习了juan chopanza的优秀例子现在我想传递一个类成员函数作为注册回调,而不是一个简单的函数。
我已经意识到,我可以通过使用绑定(&class::member,instance)来调用类成员,如下所示:
class A {
public:
void A_Bar() { std::cout << "A" << m_nTest << "_bar()" << std::endl; }
void A_Foo(int n) { std::cout << "A" << m_nTest << "_Foo(" << n << ")" << std::endl; }
int m_nTest;
};
int main(int argc, _TCHAR* argv[])
{
A A1; A1.m_nTest = 1;
A A2; A2.m_nTest = 2;
Subject<EventType> s;
s.registerObserver(EventType::GREEN, bar);
s.registerObserver(EventType::GREEN, std::bind(&A::A_Bar, A2));
s.registerObserver(EventType::GREEN, std::bind(&A::A_Bar, A1));
s.notify(EventType::GREEN);
}
由于上的第一个参数成为调用它的类。我得到了我想要的东西:
- bar()
- A2_bar()
- A1_bar()
但现在我也想让notify将一些信息传递给observer类。因此,我将代码修改为:
template <typename Event>
class Subject
{...
void notify(const Event& event, int nParameter) const
{
for (const auto& obs : observers_.at(event)) obs(nParameter);
}
private:
std::map<Event, std::vector<std::function<void(int)>>> observers_;
};
现在我想注册:
s.registerObserver(EventType::GREEN, std::bind(&A::A_Foo, A2));
有人能帮我找出我缺少的东西或如何做到这一点吗。我真的不想通过将Observer类添加到函数接口中来让Subject类了解它。感谢
使用bind
的代码可能会有问题,因为它复制了对象A2和A1,您可以使用&A2和&A2,如果要参照原始对象。要回答您的问题,您可以使用:
s.registerObserver(EventType::GREEN, std::bind(&A::A_Foo, &A2, std::placeholders::_1));
或者使用lambda,我建议使用:
s.registerObserver(EventType::GREEN, [&](int i){ A2.A_Foo(i); });
相关文章:
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- 绑定类函数观测器c++11