【问题标题】:std::function to member functionstd::function 到成员函数
【发布时间】:2023-03-31 13:58:01
【问题描述】:
#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

【问题讨论】:

  • 您需要 _2 和 _1 但这似乎不是您遇到的错误。是否包含正确的占位符标题?
  • 它在 _2 变量之后起作用
  • 我希望编译器会给出正确的错误。这是明显的错误,但编译器在说什么并不明显。

标签: c++ function-pointers


【解决方案1】:

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

【讨论】:

  • 无论是作为对象传入还是作为绑定指针传入都可能无关紧要,两者都允许。当然,在指向局部变量的指针在被调用时将悬空的情况下可能很重要。
  • @hidayat 占位符是一个神奇的对象,允许您将参数绑定到其中。 _1 表示函数的第一个参数,_2 表示函数的第二个参数。
  • ok,这些只有在绑定成员变量的时候才需要?
  • 如果您想从std::function 的调用站点“传递”参数,它们是必需的。它们允许您从调用站点重新排列、复制和省略参数。在这种情况下,它们是您分别填写到xy 中的参数的占位符。
【解决方案2】:

我花了一段时间才弄清楚发生了什么。因此,为了其他人的利益,在这里添加它,解释会有所帮助。为了更清楚,我重命名了一些函数和变量。

#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 可用于通过传递对象(指针或引用)将成员函数“转换”为普通函数。它是args(在本例中为&amp;aa)列表中的第一个参数,位于成员函数之后。在新函数中,对象绑定到成员函数的隐式/隐藏参数,调用时不需要传递。未绑定的参数由占位符 _1_2 表示,并且必须在调用时传递。

【讨论】:

  • 知道为什么一半的答案在他们的 std::bind 中使用“&a”而你的使用“a”吗?我只能让'a'版本工作。 IE。 std::bind(&fn, a, _1,..)
  • 对象可以是指针&amp;a 或引用a,两者都应该工作。检查编译器和版本是否存在任何限制。
猜你喜欢
  • 2012-08-22
  • 2015-03-04
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多