c++ - 声明类型包含未扩展的参数包 'Args'

标签 c++ c++11

我正在尝试编写一个监听器/回调类,但我在调用方法中获取声明类型包含未扩展的参数包“Args”。 我想这样称呼: listeners.call (&ListenerType::myCallbackMethod、arg1、arg2 等);

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

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 类型的参数,这是一个参数包。所以你只需要使用 ...

扩展该参数包

关于c++ - 声明类型包含未扩展的参数包 'Args',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42208382/

相关文章:

c++ - 构造函数作为函数 try block - 异常中止程序

java - 限制 try block 范围。有关系吗?

c++ - 从 AudioInputIOProc 创建 CMSampleBufferRef

C++ std::map 异构函数指针

c++ - 没有使用模板功能从 `int` 到 `float` 的自动转换

c++ - 如何打印属于 map 的一系列元素 (std::pair<size_t, std::string>)(不是所有元素)

c++ - 从 time_point + duration 到 duration 的转换在 clang 上失败

c++ - 转换、转换和强制之间有什么区别?

c++ - "Utopian Tree"如何解决

c++ - (n*2-1)%p : avoiding the use of 64 bits when n and p are 32 bits