gpt4 book ai didi

C++ 使用 std::function 和 std::bind 不调用函数委托(delegate)给成员函数

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:08 25 4
gpt4 key购买 nike

这让我很困惑。下面我们有三个类,Paddle 类和两个调用 Paddle 对象成员的包装类。

Paddle 对象不与委托(delegate)一起工作,但在从包装类调用时起作用。所有函数都具有相同的签名和重载。

编译器没有抛出任何错误,代码运行正常,但出现上述意外行为。

为什么会这样?

// sf::Transformable has 2 overloaded member functions:
// void setPosition(float x, float y);
// void setPosition(const Vector2f& position);

class Paddle : public sf::Drawable, public sf::Transformable {}

Paddle paddle{};

// wrap the calls in another class with the same overload signatures as paddle
// used to show delegate working with overloads
class A
{
public:
void setPosition(sf::Vector2f& v) {
paddle.setPosition(v);
}
void setPosition(float x, float y) {
paddle.setPosition(x, y);
}
};

// inherit members from A
// used to show delegate working with inherited overloads
class B : public A {};

// delegate typedef
typedef std::function<void(float,float)> TranslateDelegate;

// create wrapper classes
A a{};
B b{};

// create 3 delegates
TranslateDelegate pda = std::bind(static_cast<void(A::*)(float, float)>(&A::setPosition), a, std::placeholders::_1, std::placeholders::_2);
TranslateDelegate pdb = std::bind(static_cast<void(B::*)(float, float)>(&B::setPosition), b, std::placeholders::_1, std::placeholders::_2);
TranslateDelegate pdp = std::bind(static_cast<void(Paddle::*)(float, float)>(&Paddle::setPosition), paddle, std::placeholders::_1, std::placeholders::_2);

pda(300.f, 900.f); // sets paddle position correctly
pdb(300.f, 900.f); // sets paddle position correctly
pdp(300.f, 900.f); // DOES NOTHING!!

最佳答案

想通了。似乎对于桨,我需要将地址传递给 std::bind,不像 a 和 b:

TranslateDelegate pdp = std::bind(static_cast<void(Paddle::*)(float, float)>(&Paddle::setPosition), &paddle, std::placeholders::_1, std::placeholders::_2);

我假设这是因为 A 和 B 中的函数要么在上下文中工作,要么作为静态类函数被调用。

关于C++ 使用 std::function 和 std::bind 不调用函数委托(delegate)给成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25902871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com