如何使用模板参数来定义委托一个或多个boost仿函数的成员函数的签名

时间:2013-11-21 20:42:28

标签: c++ templates boost functor

我相信应该有一种方法可以使用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,并作为列表中每个回调的传递。

提前致谢!

0 个答案:

没有答案