Как интеллектуальные указатели должны спуститься литые?

Существует много альтернатив, например:

  • Альтернативный 1:

    git fetch && git checkout test
    

    Это - самый простой путь.

  • Альтернативные 2:

    git fetch
    git checkout test
    

    Это - то же, но в два погружается.

5
задан dlanod 2 September 2009 в 00:20
поделиться

4 ответа

Интеллектуальные указатели могут обрабатывать понижающее преобразование, но не автоматически. И получение константной корректности может быть немного сложным (я ' Я использовал нашу реализацию интеллектуального указателя в вопросах интервью, здесь есть некоторые хитрости с шаблонами). Но многие пользователи интеллектуальных указателей в любом случае никогда не создают экземпляры своих интеллектуальных указателей с типами, квалифицированными константой.

Первое, что вам нужно сделать, это счетчик. Так как вам может потребоваться совместное использование счетчика между smart_ptr и smart_ptr , тип счетчика не должен зависеть от аргумента типа. В общем, это все равно не имеет большого значения. Счетчик - это просто size_t, вероятно, заключенный в класс. (Примечание: существуют альтернативные конструкции интеллектуальных указателей, но вопрос настоятельно предполагает, что используется счетчик)

Приведение к основанию должно быть довольно тривиальным. Следовательно, ваш smart_ptr должен иметь конструктор, принимающий smart_ptr. В этом ctor добавьте строку static_cast ((U *) 0); . Это не генерирует код, но предотвращает создание экземпляра, когда T не является основанием U (по модулю const квалификации).

Обратным способом должно быть явное приведение. Вы не можете программно перечислить все базы T, поэтому smart_ptr не может быть производным от smart_ptr , smart_ptr , ... Следовательно, dynamic_cast > не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast (smart_ptr const & pU) . Лучше всего это реализовать как функцию восстановления SPT . В этой функции вы можете просто выполнить return SPT (dynamic_cast (& * pU)) .

но предотвращает создание экземпляра, когда T не является основанием U (по модулю const).

Другой способ - явное приведение. Вы не можете программно перечислить все основания T, поэтому smart_ptr не может быть производным от smart_ptr , smart_ptr , ... Следовательно, dynamic_cast > не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast (smart_ptr const & pU) . Лучше всего это реализовать как функцию восстановления SPT . В этой функции вы можете просто выполнить return SPT (dynamic_cast (& * pU)) .

но предотвращает создание экземпляра, когда T не является основанием U (по модулю const).

Другой способ - явное приведение. Вы не можете программно перечислить все базы T, поэтому smart_ptr не может быть производным от smart_ptr , smart_ptr , ... Следовательно, dynamic_cast > не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast (smart_ptr const & pU) . Лучше всего это реализовать как функцию восстановления SPT . В этой функции вы можете просто выполнить return SPT (dynamic_cast (& * pU)) .

t программно перечислить все базы T, поэтому smart_ptr не может быть производным от smart_ptr , smart_ptr , ... Следовательно, dynamic_cast > не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast (smart_ptr const & pU) . Лучше всего это реализовать как функцию восстановления SPT . В этой функции вы можете просто выполнить return SPT (dynamic_cast (& * pU)) .

t программно перечислить все базы T, поэтому smart_ptr не может быть производным от smart_ptr , smart_ptr , ... Следовательно, dynamic_cast > не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast (smart_ptr const & pU) . Лучше всего это реализовать как функцию восстановления SPT . В этой функции вы можете просто выполнить return SPT (dynamic_cast (& * pU)) .

SPT> (smart_ptr const & pU) . Лучше всего это реализовать как функцию восстановления SPT . В этой функции вы можете просто выполнить return SPT (dynamic_cast (& * pU)) .

SPT> (smart_ptr const & pU) . Лучше всего это реализовать как функцию восстановления SPT . В этой функции вы можете просто выполнить return SPT (dynamic_cast (& * pU)) .

5
ответ дан 14 December 2019 в 04:43
поделиться

Требуемое свойство - ковариация в указанном типе. То есть, если D - это B, тогда вы хотите smartptr isa smartptr . Я не думаю, что это вообще элегантно поддерживается в C ++, но, как всегда, доступны хаки с шаблонами / перегрузками.

http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/pointer_cast .html дает динамическое приведение, которое работает с обычным и boost :: smart_ptr. Вы должны извлечь уроки из реализации, если не хотите использовать только Boost.

2
ответ дан 14 December 2019 в 04:43
поделиться

Следите за веткой здесь в одном из списков рассылки по ускоренной рассылке. Он показывает, как можно реализовать понижающее преобразование интеллектуального указателя в случае boost :: shared_ptr. HTH

1
ответ дан 14 December 2019 в 04:43
поделиться

Обычные интеллектуальные указатели, такие как std :: auto_ptr , небезопасно использовать в контейнерах STL из-за перемещения прав собственности примерно, когда STL назначает экземпляры интеллектуальных указателей друг другу при копировании данных внутри. Вместо этого вам нужно использовать что-то вроде boost :: shared_ptr , которое внутренне реализует подсчет ссылок, чтобы гарантировать, что объект остается живым независимо от того, сколько экземпляров интеллектуального указателя ссылается на него. Если вы пишете свои собственные типы интеллектуальных указателей, вам необходимо реализовать аналогичный подсчет ссылок.

0
ответ дан 14 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: