【发布时间】:2015-04-28 01:38:07
【问题描述】:
我想使用std::unique_ptr 的删除器来保证某些代码会在离开作用域时执行。例如,假设我有一个类 Event,其函数为 set_event()。
我想确保在离开作用域时,函数my_event.set_event() 将被调用。我设法得到了类似的东西:
Event my_event;
auto releasing_function = [&my_event] (void*){my_event.set_event();};
std::unique_ptr<void, decltype(releasing_function)> safe_event((void*)1, releasing_function);
但我觉得我们可以做得更好。可能是一个没有这个自动 lambda 函数的衬里,或者避免这个丑陋的(void*)1。甚至可能完全删除unique_ptr。
编辑:我想避免使用实用程序类。这太容易了:)
【问题讨论】:
-
您可以使用类似于
BOOST_SCOPE_EXIT的内容。不过,通常情况下,你会有一个 RAII 类。 -
“太容易了”有什么问题?这比滥用现有的功能(如 unique_ptr)要好,从而将 h**l 从可怜的 schmuck 中弄糊涂,他们必须在未来的某个时候维护它。
-
实用程序类是正确的方法。编写代码是为了让它尽可能简单,以便在 6 天/周/月/年之内,任何需要维护它的人都知道它在做什么。聪明是坏事。做最简单、最清楚的事情。
-
@RobK:当标准的实用程序类很好时,不需要新的实用程序类。只需要一个小的制造商功能。
-
真正需要的是 C++ 中的 try / finally。我想知道这是否已经被讨论过:-)
标签: c++ c++11 unique-ptr