C++ 如何使用template param定义为一个或多个boost函子委派的成员函数的签名

C++ 如何使用template param定义为一个或多个boost函子委派的成员函数的签名,c++,templates,boost,functor,C++,Templates,Boost,Functor,我相信应该有一种方法可以用boost-bind或lambda来实现这一点,但我的答案是空的。任何帮助都将不胜感激 假设我正在实现一个观察者模式。我试图编写一个通用的publisher类,其模板参数定义订阅方回调的签名。下面是publisher类的简化示例: template <class T> class Publisher { public: void Subscribe(boost::function<T> callback) { _c

我相信应该有一种方法可以用boost-bind或lambda来实现这一点,但我的答案是空的。任何帮助都将不胜感激

假设我正在实现一个观察者模式。我试图编写一个通用的publisher类,其模板参数定义订阅方回调的签名。下面是publisher类的简化示例:

template <class T>
class Publisher
{
public:
    void Subscribe(boost::function<T> callback)
    {
        _callbacks.push_back(callback);
    }
private:
    std::list< boost::function<T> > _callbacks;
};
模板
类发布者
{
公众:
无效订阅(boost::函数回调)
{
_回调。推回(回调);
}
私人:
std::list\u回调;
};
假设我想让发布者用float和int值通知其订阅者。我会像这样实例化发布者:

Publisher<void(float,int)> publisher;
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;
        }
    }
 }
{
无效通知(浮点浮点浮点值、整数浮点值)
{
std::list::迭代器iter=_回调。begin();
while(iter!=\u callbacks.end())
{
*国际热核聚变实验堆(floatVal,intVal);
++iter;
}
}
}
在一般情况下,这很困难,因为“T”可以表示任何函数签名类型。我需要一种声明“Notify”的方法,以便它与回调具有相同的arity,并充当列表中每个回调的传递


提前谢谢

您可以将
Notify
定义为可变模板(c++11),也可以定义批量模板重载以覆盖所有所需的算术。(顺便说一句,看起来你试图重新发明Boost.Signals2。)谢谢@IgorR。我可以使用可变模板,但也对如何在没有C++11支持的情况下使用它感兴趣。我认为应该有一种方法可以做到这一点,使用Boost函数类型和MPL或Fusion的组合。(我最初是使用Boost Signals2实现的,但我需要特殊的行为来安全地管理发布者和订阅者的生命周期。Signals2对此也有一些支持,但有一些限制。)