如何在地图中使用存储指向成员函数的指针的Binder2nd对象?

时间:2011-03-22 10:23:23

标签: c++ stl

我的问题类似于this one。我需要在地图中存储指向成员函数的指针。成员函数接受一个参数,该参数在构造映射时必须以特定值绑定。我怎么做? map应该有一个binder2nd对象作为其值。

例如:

enum { FOO, BAR };

exMap["foo"]  = bind2nd(&classA::Func, FOO);

我不知道如何声明这张地图。

3 个答案:

答案 0 :(得分:2)

以下是使用Boost.Function

的示例
#include "boost/function.hpp"
#include <map>
#include <iostream>
#include <functional>

struct Foo {
    void bar(int x) {
        std::cout << "bar called with x=" << x << std::endl;
    }
};

int main()
{
    Foo foo;
    std::map<int, boost::function<void (Foo*)> > m;

    m[1] = std::bind2nd(std::mem_fun(&Foo::bar), 3);

    m[1](&foo);

    return 0;
}

显然binder2nd无法做到这一点,因为它不是默认构造的,这是std::map值的要求。

由于您无法使用Boost,因此您必须编写自己的活页夹。

答案 1 :(得分:1)

而不是bind2nd您可以使用std::pair手动执行此操作。一个例子:

#include <map>
#include <functional>
#include <string>

enum { FOO, BAR };

class classA{
public:
    void Func(int){}
};

// define classAMemFn
typedef void (classA::*classAMemFn)(int);
// define element
typedef std::pair<classAMemFn, int> XElement;

typedef std::map<std::string, XElement> XMap;

void setup(XMap& xmap){
    xmap["FOO"]=std::make_pair(&classA::Func,FOO);
    xmap["BAR"]=std::make_pair(&classA::Func,BAR);
}

void Caller(XMap& xmap, const std::string& key, classA& obj){
    XMap::iterator it=xmap.find(key);
    if (it!=xmap.end()) {
        XElement e=it->second;
        (obj.*e.first)(e.second);
    }
}

setup函数'绑定'指向成员函数的指针和一个字符串键的参数。

Caller函数封装了在地图中查找对并执行调用的混乱业务。

答案 2 :(得分:0)

正如我从您对该问题的评论中所理解的那样,您需要从字符串到枚举的映射,然后您想要调用具有枚举值的函数。
如果是这样,为什么你用粘合剂使事情变得复杂?

您可以简单地执行以下操作:

// Initialize your map with appropriate string -> enum mappings.

callYourFunction(yourMap[yourStringFromInput]);

地图的类型是:

std::map<std::string, YourEnumType> yourMap;

功能原型:

SomeReturnType callYourFunction(YourEnumType e);

就是这样,不再有粘合剂;)