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

Declaration type contains unexpanded parameter pack 'Args'

本文关键字:Args 参数 类型 包含未 声明      更新时间:2023-10-16

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

好的,我可以创建许多具有不同参数数的调用方法,但是如果可以的话,只有一种方法更好

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);
    }
};

有什么建议吗?谢谢!

我相信问题就在这里:

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

这应该是:

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

您指定随之传递的函数指针采用类型为 Args 的参数,即参数包。因此,您只需要使用...扩展该参数包