All streams
Search
Write a publication
Pull to refresh
63
0
Дмитрий Пономарев @dm_frox

Программист

Send message
Все изменения инкапсулированы в шаблоне ImplPtrBase. Вот немного упрощенный вариант (без удалителя):
using SH = System::Runtime::InteropServices::SafeHandle;
using PtrType = System::IntPtr;

template <typename T>
public ref class ImplPtrBase : SH
{
protected:
    ImplPtrBase(T* p) : SH(PtrType::Zero, true)
    {
        handle = PtrType(p);
    }

    T* Ptr() { return static_cast<T*>(handle.ToPointer()); }

    bool ReleaseHandle() override
    {
        delete Ptr();
        return true;
    }

public:
    property bool IsInvalid
    {
        bool get() override
        {
            return (handle == PtrType::Zero);
        }
    }
};

Спасибо, что обратили внимания. SafeHandle это тяжелая артиллерия. Но для полноты картины, наверное, стоит привести вариант с его использованием. Для этого шаблон ImplPtrBase надо наследовать от SafeHandle, и немного переписать его. Все остальное остается без изменений.
Термин «родной», как перевод native, используется в переводе упомянутой книги Хогенсона, и, наверное, достаточно часто в других публикациях. Еще я встречал слово «собственный». Вообще, мнения по правильному переводу иногда переходит на уровень религиозных войн, возможно, я напишу когда-нибудь статью на эту тему.
Про ограниченность RAII я пишу прямым текстом, раздел 6 как раз и посвящен тому, как можно преодолеть эту ограниченность. Проблемы традиционного протокола создания/удаления объекта через конструктор и деструктор и методы их решения не обсуждал. Несомненно, что это интересная тема, но статья и так большая, пришлось себя ограничивать.
Я сейчас готовлю статью, где (в том числе) обсуждается потенциальная опасность ситуации, когда функции-члены генерируются компилятором. Про проблемы перемещения, генерируемого компилятором, подробно пишет Скотт Мейерс. Я горячий сторонник все делать явно.
Спасибо! Я подозревал, что могу быть не оригинальным, но эта статья выстрадана, я с ней возился несколько лет. А Страуструпа обязательно посмотрю.
Спасибо! В действительности самая первая версия этой статьи где-то 8 лет назад и появилась. Но пришел С++11 с его семантикой перемещения и многое пришлось пересмотреть, эта моя статья несомненно рекордсмен по продолжительности написания.
Спасибо! Искать «научную новизну» в текстах по программированию, мне кажется, не совсем правильно. А рассказ про RVO, RAII и даже семантику перемещения это не цель, а просто необходимый фон для освещения главной цели статьи: рассказать как правильно проектировать классы, управляющие ресурсами.
Спасибо, не обратил внимания! Но при кодировании я придерживаюсь правила: как можно меньше использовать всяких правил по умолчанию, так как они снижают читаемость кода и иногда довольно запутанны, что усугубляет ситуацию. Так, что я почти всегда использую конструкции "=default" и "=delete", даже если их можно опустить.
Спасибо! Да, статья рассчитана на опытного программиста. Стиль конспективный, иначе объем стал бы чрезмерно большим. Моя задача была дать опытному программисту варианты выбора при проектировании классов, управляющих ресурсами, описать некоторые тонкости и подводные камни.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity