实现"static observer pattern"
Implement a "static observer pattern"
我有一个类的方法模板:
struct Subject
{
template <typename T>
void doSomething()
{
..
}
};
现在每当doSomething
被调用时(与任何T
一起),我希望有一个"观察者"被通知:
template <typename T>
void onDoSomething()
{
..
}
观察器必须是一个方法模板(包含方法的类模板也可以)。如果不是,我可以直接实现常见的观察者模式。
修改Subject::doSomething()
使其调用一个方法是可以的。但是,Subject
类不应该"知道"具体的Observer/Observer方法。
背后的想法是:我在两个项目中使用Subject
。我只需要(并且拥有)其中一个中的观察者。
有办法做到这一点吗?
很难。这似乎可以归结为
通知必须在编译时可解析(这是一个模板)
,同时
通知不应该在编译时解析(
Subject
不应该知道观察者)
我可以想到两种方法:
1.
添加doSomething
:
template <typename T, typename Observer>
void doSomething()
{
doSomething<T>();
Observer::onDoSomething<T>();
}
则调用项目A中的单参数版本,项目b中的双参数版本。
2.
让定义Subject
的文件包含一个头文件,在每个项目中会有不同的/不同的配置:
Subject.h
#include "observer_def.hpp"
struct Subject
{
template <typename T>
void doSomething()
{
..
notifyDoSomething<T>();
}
};
在项目observer_def.hpp :
template <typename>
inline void notifyDoSomething() {}
observer_def.hpp项目B :
template <typename T>
inline void notifyDoSomething()
{
MyObserver::onDoSomething<T>();
}
我最终通过模板特化找到了一个令人满意的解决方案:
///signaling struct. Could be replaced with any other type.
struct SpecializedObserver{};
///unspecialized:
template <typename>
struct Observer
{
template <typename T>
static void onDoSomething()
{
//default: do nothing.
}
};
///optional. Specialize in project A or leave aside in project B:
template<>
struct Observer<SpecializedObserver>
{
template <typename T>
static void onDoSomething()
{
std::cout << "doing something with " << typeid(T).name() << std::endl;
}
};
struct Subject
{
template <typename T>
void doSomething()
{
Observer<SpecializedObserver>::onDoSomething<T>();
..
}
};
如果我不想要观察者,这个解决方案不需要任何操作。如果我想有一个,我专门化观察者模板如上所示。
EDIT:这在我的测试中工作得很好,但是问题是我如何在具有不同编译单元的场景中使用它-我应该在哪里定义专门化?
相关文章:
- 在"Observer pattern"上复制构造函数
- 关于std::cout,为什么使用"extern"比"singleton pattern"
- "Prototype pattern"和"Virtual constructor"是相同的模式吗?
- 如何在C++中实现"Registry pattern",使用单个注册表实现多个接口
- 使用模板实现"visitor pattern"
- "State pattern" vs "one member function per state" ?
- 对未定义的C++班次操作员行为和换行"pattern space"感到困惑
- 在C++中将Observed类引用为Observer的成员变量
- QRegExp Pattern For URLs
- 定义参数包扩展的"pattern",尤其是在函数调用中
- 如何使用和专门化'curious repeating template pattern'
- 如何使运算符过载并且不使用"Curiously Recurring Template Pattern"和"Run Time polymorphism"
- 在多个线程上自行取消/注册Observer
- C++中Observer模式实现中的循环引用
- 为什么'visitor pattern'要求每个类继承具有accept()函数的VisitorHost接口类?
- 实现"static observer pattern"
- 在C++中实现了Observer模式
- 在这种情况下,'double checked locking pattern'对 std::mutex 有好处吗?
- 为什么"out variable pattern"在 C++ 中如此频繁地使用?
- 使用"Curiously Recurring Template Pattern"的增量数字