我的问题类似于this one。我需要在地图中存储指向成员函数的指针。成员函数接受一个参数,该参数在构造映射时必须以特定值绑定。我怎么做? map应该有一个binder2nd对象作为其值。
例如:
enum { FOO, BAR };
exMap["foo"] = bind2nd(&classA::Func, FOO);
我不知道如何声明这张地图。
答案 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);
就是这样,不再有粘合剂;)