声明类型包含未展开的参数包' Args'

时间:2017-02-13 16:03:21

标签: c++ c++11

我正在试图编写一个监听器/回调类,但我在调用方法中get Declaration type contains unexpanded parameter pack 'Args'。 我想打电话给: listeners.call (&ListenerType::myCallbackMethod, arg1, arg2, etc);

好的,我可以使用不同数量的args创建许多调用方法,但是如果我能做到只有一种方法更好

template <typename ...Args>
void call (void (ListenerClass::*callbackFunction) (Args), Args && ...value) // Compiler error: Declaration type contains unexpanded parameter pack 'Args'
{
    auto iter = listeners.begin(); 
    while (iter != listeners.end())
    {
        if(auto p = iter->lock())
        {
            (p->*callbackFunction) (std::forward<Args>(value)...); 
            ++iter;
        }
        else
            iter = listeners.erase(iter);
    }
};

有什么建议吗? 谢谢!

1 个答案:

答案 0 :(得分:4)

我认为问题出在这里:

template <typename ...Args>
void call (void (ListenerClass::*callbackFunction) /*here->*/(Args), Args && ...value)

这应该是:

template <typename ...Args>
void call (void (ListenerClass::*callbackFunction) (Args...), Args && ...value)

您指定要传递的函数指针采用类型为Args的参数作为参数包。因此,您只需使用...

扩展该参数包