首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAII函数调用

RAII函数调用
EN

Stack Overflow用户
提问于 2022-10-28 15:42:22
回答 3查看 110关注 0票数 2

标准库中是否有一个类将调用其析构函数中提供的函数?就像这样

代码语言:javascript
复制
class Foo
{
public:
 template<typename T>
 Foo(T callback)
 {
   _callback = callback;
 }
 ~Foo()
 {
   _callback();
 }
private:
 std::function<void()> _callback;
};
auto rai = Foo([](){ cout << "dtor";});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-10-28 16:02:33

有一个实验性的scope_exit

示例:https://godbolt.org/z/4r54GYo33

票数 8
EN

Stack Overflow用户

发布于 2022-10-28 16:09:16

为此您可以使用std::shared_ptr

代码语言:javascript
复制
std::shared_ptr<void>(nullptr, [](void*){ std::cout << "dtor\n";});

在网上看

std::shared_ptr调用删除器,即使托管指针是nullptr,因此不需要在其中使用任何虚拟指针。但是,就我个人而言,我会再次强烈关注以这种方式使用std::shared_ptr的问题,而且我可能不会让它通过审查。这是一个很大的问题(虽然它可能会成为一个成语,如果它在整个项目中使用)。

票数 2
EN

Stack Overflow用户

发布于 2022-10-28 16:18:30

为了实现它,我建议不要使用类型擦除的std::function

下面是一个可能的实现

代码语言:javascript
复制
template<typename F>
struct scope_exit{
    [[nodiscard]]
    scope_exit(F&& f):f(std::move(f)){}
    ~scope_exit(){f();}

    scope_exit(const scope_exit&)=delete;
    scope_exit& operator=(const scope_exit&)=delete;

    F f;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74237761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档