我相信应该有一种方法可以使用boost bind或lambda来做到这一点,但我现在空了。任何帮助将不胜感激。
假设我正在实施观察者模式。我正在尝试编写一个通用的发布者类,其模板参数定义了订阅者回调的签名。以下是发布商类的简化示例:
template <class T>
class Publisher
{
public:
void Subscribe(boost::function<T> callback)
{
_callbacks.push_back(callback);
}
private:
std::list< boost::function<T> > _callbacks;
};
假设我想让发布者通过float和int值通知其订阅者。我会像这样实例化发布者:
Publisher<void(float,int)> publisher;
现在这是我的问题。我希望在Publisher中有一个名为“Notify”的方法,它与回调具有相同的签名。它的目的是遍历回调列表并使用参数调用它们。
在上面的float和int签名的情况下,我希望函数看起来像:
{
void Notify(float floatVal, int intVal)
{
std::list< boost::function<T> >::iterator iter = _callbacks.begin();
while (iter != _callbacks.end())
{
*iter(floatVal, intVal);
++iter;
}
}
}
在一般情况下,这很困难,因为“T”可以表示任何函数签名类型。我需要一种方法来声明“Notify”,以便它与回调具有相同的arity,并作为列表中每个回调的传递。
提前致谢!