C ++使用预定义参数调用静态函数指针

时间:2012-02-25 15:51:46

标签: c++

我有一个相当不寻常的问题......我们的任务是将一系列十六进制值映射到函数指针。但是,我希望能够使用已预定义的参数调用该函数。以下是我想要开始工作的一段代码:

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;
}

但是,它只会让我将没有参数的函数放入映射中。如何存储此设置并稍后调用?

2 个答案:

答案 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