gpt4 book ai didi

c++ - 在调用之前检查 std::function 的有效性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:49 29 4
gpt4 key购买 nike

我正在尝试编写一个简单但灵活的事件系统(主要是作为练习,我知道现有的库具有非常好的事件处理程序),但我遇到了一个小绊脚石。

如何检查作为委托(delegate)的 std::function(可能通过 lambda,可能通过 std::bind)是否为有效函数/成员函数的对象是否仍然存在在打电话之前?我试过简单地使用 std::function 的 bool 运算符,但没有取得任何成功。

理想情况下,我希望 A. 在委托(delegate)函数内部以外的地方进行检查,并且 B. 当被检查的 std::function 不是委托(delegate)时,代码仍然有效。

有什么想法吗?

编辑:这是我运行的测试的源代码

#include <iostream>
#include <string>
#include <functional>

class Obj {
public:
std::string foo;
Obj(std::string foo) : foo(foo) {}
std::function<void()> getDelegate() {
auto callback = [this]() {this->delegatedFn();};
return callback;
}
void delegatedFn() {
std::cout << foo << std::endl;
}
};

int main() {
Obj* obj = new Obj("bar");
std::function<void()> callback = obj->getDelegate();
callback();
delete obj;

//perform some type of check here whether function is valid, without needing to know whether the function is a delegate or not
if(callback) {
std::cout << "Callback is valid" << std::endl; //callback is still considered valid after obj is deleted
callback(); //no exception thrown, prints a random series of characters
}
else {
std::cout << "Callback is invalid" << std::endl;
}

return 0;
}

最佳答案

您可以使用智能指针 (std::shared_ptr/std::weak_ptr) 而不是裸指针:

#include <iostream>
#include <string>
#include <functional>
#include <memory>

class Obj {
public:
std::string foo;
Obj(std::string foo) : foo(foo) {}
void delegatedFn() {
std::cout << foo << std::endl;
}
};

int main() {
auto obj = std::make_shared<Obj>("bar");
std::weak_ptr<Obj> ptr = obj;
std::function<void()> callback = [ptr](){
auto sh = ptr.lock();
if(sh) { std::cout << "valid" << std::endl; sh->delegatedFn(); }
else { std::cout << "invalid" << std::endl; }
};
callback();
obj = nullptr;
callback();
return 0;
}

在这种情况下,您不会直接检查 std::function有效性(当您为它分配某些东西时它是有效的,即使那个东西 捕获一个悬挂指针)。
相反,您可以从函数本身内部检查引用的对象是否仍然存在。

关于c++ - 在调用之前检查 std::function 的有效性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39917634/

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