Напишите свой собственный. Это всего лишь несколько строк кода. Это просто такая простая задача, что не стоит предоставления универсальной многоразовой версии.
struct FileWrapper {
FileWrapper(...) : h(CreateFile(...)) {}
~FileWrapper() { CloseHandle(h); }
private:
HANDLE h;
};
Подумайте о том, что должна делать универсальная версия: она должна быть параметризованной, чтобы вы могли указать любую пару функций и любое количество аргументов для них. Простое создание экземпляра такого объекта может занять столько строк кода, сколько указано в приведенном выше определении класса.
Конечно, C ++ 0x может несколько изменить баланс с добавлением лямбда-выражений. Два лямбда-выражения можно легко передать в универсальный класс-оболочку, поэтому, как только появится поддержка C ++ 0x, мы могли бы увидеть, что такой универсальный класс RAII добавлен в Boost или что-то в этом роде.
Но на данный момент проще бросить свой собственный, когда вам это нужно.
Что касается добавления подсчета ссылок, я бы посоветовал против этого. Подсчет ссылок стоит дорого (внезапно ваш дескриптор должен быть выделен динамически, а счетчики ссылок должны поддерживаться при каждом назначении), и его очень сложно получить правильно. Это область, изобилующая тонкими условиями гонки в многопоточной среде.
Если вам нужно подсчитывать ссылки, просто сделайте что-то вроде boost::shared_ptr<FileWrapper>
: оберните ваши специальные классы RAII в shared_ptr
.