我有一个相当不寻常的问题......我们的任务是将一系列十六进制值映射到函数指针。但是,我希望能够使用已预定义的参数调用该函数。以下是我想要开始工作的一段代码:
map<short, void(*)(MyClass, MyClass)> mapping = create_map();
map<short, void(*)(MyClass, MyClass)> create_map()
{
map<short, void(*)(MyClass, MyClass)>> m;
m[1] = &function(new MyClass(), new MyClass());
return m;
}
但是,它只会让我将没有参数的函数放入映射中。如何存储此设置并稍后调用?
答案 0 :(得分:3)
如果您使用的是C ++ 11,则可以使用std::bind
:
void function(MyClass* a, MyClass* b) { ... }
typedef map<short, std::function<void()>> funcmap;
funcmap create_map()
{
funcmap m;
m[1] = std::bind(function, new MyClass, new MyClass);
return m;
}
// use:
funcmap mapping = create_map();
mapping[1]();
如果没有,您可以创建一个存储参数和函数指针的结构。然后编写一个operator()
,它将通过函数指针调用函数,并使用它存储的参数:
struct func {
typedef void(*fptr)(MyClass*, MyClass*);
func(fptr f, MyClass* m1, MyClass* m2) : ptr(f), arg1(m1), arg2(m2) { }
void operator()() {
ptr(arg1, arg2);
}
T ptr;
MyClass* arg1, arg2;
};
void function(MyClass* a, MyClass* b) { ... }
typedef map<short, func> funcmap;
funcmap create_map()
{
funcmap m;
m[1] = func(function, new MyClass, new MyClass);
return m;
}
// use:
map<short, func> mapping = create_map();
mapping[1]();
答案 1 :(得分:1)
如果您使用的是C ++ 11,则可以使用lambda functions。
如果您使用的是旧版C ++,则可以使用functors。