Это можно сделать с помощью lambda в C ++ 11 (проверено в G ++ 4.8.2).
Учитывая это многоразовое typedef
:
template<typename T>
using deleted_unique_ptr = std::unique_ptr<T,std::function<void(T*)>>;
Вы можете написать:
deleted_unique_ptr<Foo> foo(new Foo(), [](Foo* f) { customdeleter(f); });
Например, с помощью FILE*
:
deleted_unique_ptr<FILE> file(
fopen("file.txt", "r"),
[](FILE* f) { fclose(f); });
При этом вы получаете преимущества безопасной от исключения очистки с использованием RAII, без шума try / catch.