Хорошо зарекомендовавший себя класс интеллектуальных держателей ресурсов для C++ 14 или более поздней версии
В качестве продолжения этого вопроса я ищу класс интеллектуальных держателей ресурсов, совместимый с std::move
, Примерно так, как показано ниже, что позволит одним строкам создавать и хранить системные ресурсы с помощью C++ lambdas:
template<typename T, const T invalidValue = T(0)>
class Resource
{
public:
typedef const T& Ref;
typedef std::function<void (Ref)> Finalize;
typedef std::function<T ()> Create;
typedef std::function<void (Ref)> Validate;
private:
T _value;
Finalize _finalize;
public:
// TODO: make it "std::move" compatible
// by providing proper assignment operators and constructors
Resource() {
_value = invalidValue;
_finalize = nullptr;
}
Resource(Create create, Finalize finalize) {
_value = create();
_finalize = finalize;
}
~Resource() {
release();
}
operator Ref() const { return _value; }
void release()
{
if (invalidValue != _value && nullptr != _finalize) {
_finalize(_value);
_value = invalidValue;
}
}
};
Который может быть использован так:
Resource<HANDLE> handle(
[]() { auto h = CreateFile("filename.ext"); if (!h) throw "Error"; return h; },
[](auto h) { CloseHandle(h); });
Я знаю, что есть unique_ptr
но семантически он больше подходит для указателей, а не для ресурсов.
Так как я не хочу заново изобретать колесо, есть ли что-то подобное? Resource
уже в стандартной библиотеке C++, или что-нибудь подобное, предложенное для будущей версии?