2014-11-19 3 views
1

Я ищу что-то вроде std::static_pointer_cast, std::const_pointer_cast и std::dynamic_pointer_cast для std::shared_pointer.Указатели для itk :: SmartPointer?

Я пробовал документацию ITK и исходный код itk::SmartPointer и ничего не нашел о умении умного указателя.

В одном конкретном случае мне нужно было добавить «константу» к указателю (конвертировать itk::SmartPointer<T> в itk::SmartPointer<const T>), чтобы передать его третьей стороне. Передача необработанного указателя не может быть и речи, потому что данные будут удалены после того, как автоматически созданный const-указатель будет удален из области видимости.

Единственное относительно безопасное решение я нашел:

static_cast<itk::SmartPointer<const T>>(itk_smart_pointer_of_t).

Я не знаю, является ли этот подход потокобезопасным или имеет другие возможные подводные камни. Более того, в случае dynamic_cast все станет еще более грязным.

Кажется странным, что у ITK нет родных std::const_pointer_cast-like и других отливок.

+1

И что вы нашли? Что вы пробовали? Что вы собираетесь делать с этими вещами? И как они относятся к ITK? –

+0

@JoachimPileborg Я отредактировал мой вопрос. – ostappus

ответ

1

TL; DR: itk::SmartPointer не нуждается в указателях указателей, просто нарисуйте «необработанный» указатель и переверните его.


Интеллектуальные указатели ITK используют подсчет ссылок, что означает, что принадлежащий ему объект должен предоставить контрольный счетчик.

itk::SmartPointer может использоваться только с классами ITK или, точнее, с классами, которые имеют методы Register() и UnRegister(). Например, потомки класса itk::LightObject, которые, согласно документации,

- базовый класс самого высокого уровня для большинства объектов itk. Он реализует подсчет ссылок ...

Поэтому мое предположение, что

Передача сырой указатель находится вне вопроса, так как данные будут удалены после того, как создается автоматически Const смарт-указатель выходит из области видимости.

неверен, потому что временный itk::SmartPointer просто увеличится, а затем уменьшит счетчик ссылок на объект.

Это означает, что безопасно передавать указатель «не столь сырой» на функцию, принимающую интеллектуальный указатель, или вручную создать временный интеллектуальный указатель и передать его функции.

Смежные вопросы