c++ - 无法推断可变参数模板的模板类型

标签 c++ templates c++11 variadic-templates template-argument-deduction

我已经创建了简单的基于回调的事件管理器并且它可以工作,但是我有一些模板参数为零的错误。

class event_manager
{
public:
    template <typename... T>
    static void register_event(const unsigned long e, std::function<void(T...)> ec)
    {
        events.insert({ e, ec });
    }

    template <typename... T>
    static void fire_event(const unsigned long e, T... args)
    {
        for (auto it : events)
        {
            if (it.first == e)
            {
                boost::any_cast<std::function<void(T...)>>(it.second)(args...);
            }
        }
    }
private:
    static std::unordered_multimap<unsigned int, boost::any> events;
};

我正在使用这段代码来添加回调:

event_manager::register_event<unsigned int>(DVU_EVENT_KEY_PRESSED, [](unsigned int key)
{
    //Works!
});

event_manager::register_event(DVU_EVENT_IDLE, []()
{
    //Could not deduce template argument
});

第二个问题: 是否可以更改代码以删除 <unsigned int> -喜欢模板规范?

例子:

event_manager::register_event(DVU_EVENT_KEY_PRESSED, [](unsigned int key){}));

最佳答案

由于 lambda 只是一个带有 operator() 的仿函数,您可以只使用一个重载来推导它:

template <typename F>
static void register_event(const unsigned long e, F f) 
{
    register_event(e, f, &F::operator());
}

template <typename F, typename R, typename... T>
static void register_event(const unsigned long e, F& f, 
    R (F::*method)(T...) const) 
{
    std::function<R(T...)> func = f;
    events.insert({ e, func });
}

也许需要 R == voidstatic_assert 之类的。

关于c++ - 无法推断可变参数模板的模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548870/

相关文章:

c++ - 引用类型和文字类型

c++ - Eclipse 无法识别 std::stoi

c++ - 如何为遗留 API/框架实现大量复杂的包装器(C++ 宏与 C++ 模板与代码生成器)?

wpf - 在 WPF 中突出显示整个 TreeViewItem 行

multithreading - <thread> get_id() 和 native_handle() 之间的 C++11 区别

c++11 - 对于 IPC 共享对象 -ZeroMQ 或 Boost::interprocess 哪个更快?

c++ - 如何将十六进制字符串转换/粘贴为 vim 中的字节列表?

c++ - C++函数调用后SSBO的内容无效

c++ - 使用 Eigen C++ 进行快速一维卷积?

c++ - 通过 static_assert 强制执行模板类型