Skip to content

Instantly share code, notes, and snippets.

@ArthurSonzogni
Created July 14, 2017 17:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ArthurSonzogni/5c168e1a6f8babe1c45b23b225d344ab to your computer and use it in GitHub Desktop.
Save ArthurSonzogni/5c168e1a6f8babe1c45b23b225d344ab to your computer and use it in GitHub Desktop.
finally_delete -- Adapt old C object to RAII.
// adapt old C object to RAII
// Example:
// ```
// Object* object_pointer = nullptr;
// finally_delete(object_pointer, delete_function)
// auto* object_pointer = allocate_some_object();
// throw exception/return;
// ```
template <typename objectPointer, typename delete_function>
struct finally_delete_implementation {
finally_delete_implementation(objectPointer& o, delete_function f)
: o(o), f(f) {}
~finally_delete_implementation() {
if (o) {
f(o);
o = nullptr;
}
}
objectPointer& o;
delete_function f;
};
template <typename objectPointer, typename delete_function>
finally_delete_implementation<objectPointer, delete_function>
finally_delete_function(objectPointer& o, delete_function f) {
return finally_delete_implementation<objectPointer, delete_function>(o, f);
}
#define finally_delete(object_pointer, delete_function) \
finally_delete_helper_1(object_pointer, delete_function, __LINE__)
#define finally_delete_helper_1(object_pointer, delete_function, line) \
finally_delete_helper_2(object_pointer, delete_function, line);
#define finally_delete_helper_2(object_pointer, delete_function, line) \
const auto& finally_delete_##line = \
finally_delete_function(object_pointer, delete_function)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment