1

我正在尝试创建一个地图来保存可以注册和触发的功能。为了正确编译,我似乎无法获得正确的绑定/函数/指针语法。

这是我所拥有的:我尝试了 boost::bind 和 boost:

#include <cstdlib>
#include <iostream>
#include <boost/bind/bind.hpp>
#include <boost/function.hpp>
#include <map>

using namespace std;

typedef const std::string& listenArg;
typedef void (*Actions)(listenArg str);

std::multimap<int, Actions> functions;

// fire in the hole!

void fire(int methods, listenArg arg0) {
    std::multimap<int, Actions>::iterator function = functions.find(methods);

    typedef std::pair<int, Actions> pear;

    for (function = functions.begin(); function != functions.end(); ++function) {
        (*(function->second))(arg0);
    }
}

void listen1(listenArg arg0) {
    std::cout << "listen1 called with " << arg0 << std::endl;
}

class RegisteringClass {
public:
    RegisteringClass();
    virtual ~RegisteringClass();

    void callMeBaby(listenArg str) {
        std::cout << "baby, i was called with " << str << std::endl;
    }
};

int main(int argc, char** argv) {
    const int key = 111;


    functions.insert(make_pair<int, Actions>(key, listen1));
    fire(key, "test");

    // make a registeringClass
    RegisteringClass reg;

    // register call me baby
    boost::function<void (listenArg) >
            fx(boost::bind(&RegisteringClass::callMeBaby, reg, _1));
    //std::bind(&RegisteringClass::callMeBaby, reg, _1);
    functions.insert(
            make_pair<int, Actions> (key, fx));

    // fire
    fire(key, "test2");
    return 0;
}

谢谢你的帮助!

4

3 回答 3

4
typedef boost::function < void (listenArg) > Actions;

应该用来代替函数指针。

于 2013-04-16T20:41:48.340 回答
2

问题是您告诉编译器这Actions是一个非成员函数指针,然后您尝试将 aboost::function放入该类型的变量中。它们是两种完全不相关的类型,这样的分配不可能发生。您需要将Actionstypedefboost::function<void (listenArg)>改为 a 。

于 2013-04-16T20:41:43.230 回答
1

你可以使用boost::function模板

#include <cstdlib>
#include <iostream>
#include <boost/bind/bind.hpp>
#include <boost/function.hpp>
#include <map>

using namespace std;

typedef const std::string& listenArg;

typedef boost::function < void (listenArg) > Actions;
std::multimap<int, Actions> functions;
于 2013-04-16T20:43:59.670 回答