Существует много альтернатив, например:
Альтернативный 1:
git fetch && git checkout test
Это - самый простой путь.
Альтернативные 2:
git fetch
git checkout test
Это - то же, но в два погружается.
Интеллектуальные указатели могут обрабатывать понижающее преобразование, но не автоматически. И получение константной корректности может быть немного сложным (я ' Я использовал нашу реализацию интеллектуального указателя в вопросах интервью, здесь есть некоторые хитрости с шаблонами). Но многие пользователи интеллектуальных указателей в любом случае никогда не создают экземпляры своих интеллектуальных указателей с типами, квалифицированными константой.
Первое, что вам нужно сделать, это счетчик. Так как вам может потребоваться совместное использование счетчика между smart_ptr
и smart_ptr
, тип счетчика не должен зависеть от аргумента типа. В общем, это все равно не имеет большого значения. Счетчик - это просто size_t, вероятно, заключенный в класс. (Примечание: существуют альтернативные конструкции интеллектуальных указателей, но вопрос настоятельно предполагает, что используется счетчик)
Приведение к основанию должно быть довольно тривиальным. Следовательно, ваш smart_ptr должен иметь конструктор, принимающий smart_ptr. В этом ctor добавьте строку static_cast
. Это не генерирует код, но предотвращает создание экземпляра, когда T не является основанием U (по модулю const квалификации).
Обратным способом должно быть явное приведение. Вы не можете программно перечислить все базы T, поэтому smart_ptr
не может быть производным от smart_ptr
Следовательно, dynamic_cast
не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast
. Лучше всего это реализовать как функцию восстановления SPT
. В этой функции вы можете просто выполнить return SPT (dynamic_cast
.
Другой способ - явное приведение. Вы не можете программно перечислить все основания T, поэтому smart_ptr
не может быть производным от smart_ptr
Следовательно, dynamic_cast
не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast
. Лучше всего это реализовать как функцию восстановления SPT
. В этой функции вы можете просто выполнить return SPT (dynamic_cast
.
Другой способ - явное приведение. Вы не можете программно перечислить все базы T, поэтому smart_ptr
не может быть производным от smart_ptr
Следовательно, dynamic_cast
не будет работать. Вы можете предоставить свой собственный smart_dynamic_cast
. Лучше всего это реализовать как функцию восстановления SPT
. В этой функции вы можете просто выполнить return SPT (dynamic_cast
.
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))
. Требуемое свойство - ковариация в указанном типе. То есть, если D - это B, тогда вы хотите smartptr
. Я не думаю, что это вообще элегантно поддерживается в C ++, но, как всегда, доступны хаки с шаблонами / перегрузками.
http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/pointer_cast .html дает динамическое приведение, которое работает с обычным и boost :: smart_ptr. Вы должны извлечь уроки из реализации, если не хотите использовать только Boost.
Следите за веткой здесь в одном из списков рассылки по ускоренной рассылке. Он показывает, как можно реализовать понижающее преобразование интеллектуального указателя в случае boost :: shared_ptr. HTH
Обычные интеллектуальные указатели, такие как std :: auto_ptr
, небезопасно использовать в контейнерах STL из-за перемещения прав собственности примерно, когда STL назначает экземпляры интеллектуальных указателей друг другу при копировании данных внутри. Вместо этого вам нужно использовать что-то вроде boost :: shared_ptr
, которое внутренне реализует подсчет ссылок, чтобы гарантировать, что объект остается живым независимо от того, сколько экземпляров интеллектуального указателя ссылается на него. Если вы пишете свои собственные типы интеллектуальных указателей, вам необходимо реализовать аналогичный подсчет ссылок.