将对象函数转换为函数指针

时间:2017-03-30 20:32:17

标签: c++ c++11 c++14

我尝试将对象函数转换为函数指针,但无法获取它,我做过类似的事情,简单示例:

typedef struct
{
    int v1;

    int DoSome(int a)
    {
        return v1 * a;
    }
} strx;


int main()
{
    strx a; // instance...
    a.v1 = 2;


    std::function<int(strx* instance, int value)> DoSome = std::mem_fn(&strx::DoSome);

    cout << DoSome(&a, 4) << endl; // 16 ok 

    int(*pDoSome)(strx* instance, int value) = (int(*)(strx*, int))std::mem_fn(&strx::DoSome); // syntax error

    // ptr method...
    pDoSome(&a ,4);

    return 0;
} 

我已经获得了类似的东西:

  

main.cpp [错误]来自类型&#39; std :: _ Mem_fn&#39;输入&#39; int()(strx ,int)&#39;

我如何才能正确地完成施法?

2 个答案:

答案 0 :(得分:1)

你做不到。这就是为什么std::function比指向函数的指针更灵活的原因。

答案 1 :(得分:1)

  

我如何才能正确地完成施法?

你做不到。对象指针和函数指针是完全不同的概念。只有nullptr可用于初始化两种类型的指针。否则,它们不能保证兼容。

我建议坚持使用std::function

如果必须有函数指针,则必须使用非成员函数或类的static成员函数。

E.g。

int doSomeFunction(strx* instance, int value)
{
   // Use instance any way you please.
   // ...
   //
   return 0;
}

int main()
{
    strx a; // instance...
    a.v1 = 2;

    int(*pDoSome)(strx* instance, int value) = doSomeFunction;

    // ptr method...
    pDoSome(&a ,4);

    return 0;
}