std::function转成员函数

问题描述 投票:32回答:2
#include <functional>

struct A
{
    int func(int x, int y)
    {
        return x+y;
    }
};

int main()
{

    typedef std::function<int(int, int) > Funcp;
    A a;
    //Funcp func = std:::bind(&A::func, &a);
    Funcp func = std::bind(&A::func, a, std::placeholders::_1);


    return 0;
}

我在上述两个绑定函数中都出现了错误。

 error C2825: '_Fty': must be a class or namespace when followed by '::'

语法错误在哪里?我使用的是visual studio 2010

c++ function-pointers
2个回答
36
投票

Funcp func = std::bind(&A::func, &a, std::placeholders::_1, std::placeholders::_2);


0
投票

我花了点时间才弄明白发生了什么。所以把它添加到这里,以方便其他人,解释一下会有帮助。为了更加清晰,我对一些函数和变量进行了重命名。

#include <functional>

struct A
{
    int MemberFunc(int x, int y) 
    {
        return x+y;
    }
};

int main()
{
    typedef std::function<int(int, int) > OrdinaryFunc;

    A a;
    OrdinaryFunc ofunc = std::bind(&A::MemberFunc, a, std::placeholders::_1, std::placeholders::_2);

    int z = ofunc(10, 20); // Invoke like an ordinary function

    return 0;
}

类成员函数有一个指向对象的隐含参数(this 指针)。) 这些成员函数只有通过提供一个对象才能被调用,这使得它与普通函数不同。

std::bind 可以用来将成员函数 "转换 "为普通函数。在新函数中,对象是 束缚 到成员函数的 implicithidden 参数,并且在调用时不需要传递。未绑定的参数用占位符来表示。_1, _2 并在调用时必须通过。

© www.soinside.com 2019 - 2024. All rights reserved.