草庐IT

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

coder 2024-02-18 原文

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

如何检查作为委托(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/

有关c++ - 在调用之前检查 std::function 的有效性?的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  4. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  5. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  6. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  7. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  8. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  9. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  10. ruby - 检查日期是否在过去 7 天内 - 2

    我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

随机推荐