boost scope exit
Boost.ScopeExit provides the macro BOOST_SCOPE_EXIT, which can be used to define something that looks like a local function but doesn't have a name. However, it does have a parameter list in parentheses and a block in braces.
#include <string> #include <memory> #include <cstdio> struct CloseFile { void operator()(std::FILE* file) { std::fclose(file); } }; void write_to_file(const std::string& s) { std::unique_ptr<std::FILE, CloseFile> file(std::fopen("hello-world.txt", "a")); std::fprintf(file.get(), s.c_str()); } int main() { write_to_file("Hello, "); write_to_file("world!"); return 0; }
上述代码使用BOOST_SCOPE_EXIT,修改如下:
#include <string> #include <memory> #include <cstdio> #include <boost/scope_exit.hpp> void write_to_file(const std::string& s) { std::FILE* file = fopen("hello-world.txt", "a"); BOOST_SCOPE_EXIT(&file) { std::fclose(file); } BOOST_SCOPE_EXIT_END std::fprintf(file, s.c_str()); } int main() { write_to_file("Hello, "); write_to_file("world!"); return 0; }