C ++ - 使用map存储回调函数

时间:2017-02-13 17:29:07

标签: c++ function dictionary callback

我正在尝试使用地图存储要在特定时间调用的函数。

typedef std::function<void(rapidjson::Document&)> Callback;

std::map<std::string, Callback> _callbackDict = {
    { "foo", HandleFoo },
    { "bar", HandleBar },
};

当我尝试存储它们时会导致错误:

error: could not convert '{{"foo", ((FooBar*)this)->FooBar::HandleFoo}, {"bar", ((FooBar*)this)->FooBar::HandleBar}}' from '<brace-enclosed initializer list>' to 'std::map<std::__cxx11::basic_string<char>, std::function<void(int, int)> >'

MCVE

#pragma once
#include <map>
#include <iostream>
#include <functional>

typedef std::function<void(int, int)> Callback;
class FooBar
{
private:
    std::map<std::string, Callback> _callbackDict = {
        { "foo", HandleFoo },
        { "bar", HandleBar },
    };
public:
    FooBar();
    void HandleFoo(int a, int b);
    void HandleBar(int a, int b);
    ~FooBar();

};

2 个答案:

答案 0 :(得分:3)

以下代码编译:

namespace rapidjson { struct Document; }

void HandleFoo(rapidjson::Document&) {}
void HandleBar(rapidjson::Document&) {}    

typedef std::function<void(rapidjson::Document&)> Callback;
std::map<std::string, Callback> _callbackDict = {
    { "foo", HandleFoo },
    { "bar", HandleBar },
};

请注意,FooBar::Run()与您的问题无关,也不需要包含在您的问题中。

答案 1 :(得分:-1)

仍然不清楚您正在尝试做什么。用于编译代码的最小更改已在注释中给出;使你的职能static

namespace rapidjson {   struct Document; }

typedef std::function<void(int, int)> Callback;
class FooBar
{
    std::map<std::string, Callback> _callbackDict = {
        { "foo", HandleFoo },
        { "bar", HandleBar },
    };
public:
    static void HandleFoo(int a, int b);
    static void HandleBar(int a, int b);
};

但你真的需要得到good C++ book并阅读它;这应该是一个Q-and-A网站,而不是帮助我使用我的代码。