Хорошо зарекомендовавший себя класс интеллектуальных держателей ресурсов для 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++, или что-нибудь подобное, предложенное для будущей версии?

0 ответов

Другие вопросы по тегам