Как я могу нарисовать boost::shared_array<char>
до boost::shared_array<const char>
?Cast boost :: shared_array <char> to boost :: shared_array <const char>
ответ
Поскольку shared_array
не имеет add_ref
метод, который вы могли бы подражать его следующим образом:
struct MagicDeleter {
MagicDeleter(boost::shared_array<char> ptr) : ptr(ptr) {};
template<typename T> void operator()(T*) {}
protected:
boost::shared_array<char> ptr;
};
...
boost::shared_array<char> orig_ptr(some_val);
boost::shared_array<const char> new_ptr(orig_ptr.get(), MagicDeleter(orig_ptr));
Очень умный. Ницца :) – Catskul
Вы не можете.
Поскольку оба типа основаны на шаблоне, оба типа совершенно различны для компилятора.
Такое формирование с использованием компилятора не может быть возможным.
Внутренние элементы класса с параметром шаблона с параметром const могут сильно отличаться от класса без одного из-за функции специализированного шаблона.
Кроме того, использование такой функции иногда является фоном для проверок времени компиляции, которые просто не позволяют создать экземпляр типа A<const T>
для каждого случая, когда тип A<T>
верен.
Невозможно? Тем не менее boost :: shared_ptr поддерживает неявное преобразование из производных в базовые типы (и не const const) и всевозможные приведения. –
Это действительно поддерживает * преобразование *. Но это не может быть * type-casted *. –
Он поддерживает броски, если вы не имеете в виду ничего другого. Например, 'boost :: shared_ptr
Я думаю, вы не можете. Если вам это действительно нужно, вы можете создать собственный класс интеллектуальных указателей. Подсказки для этого можно найти here.
Другие ответы верны, вы не можете и не должны.
Кроме того, вы уверены, что хотите boost::shared_array<const char>
, а не const boost::shared_array<char>
?
Практически, это работает:
boost::shared_array<char> acz;
boost::shared_array<const char>& acz2 = reinterpret_cast< boost::shared_array<const char>& >(acz);
НО это не очень хорошая идея, и работает только тогда, когда повышение :: shared_array и повышение :: shared_array имеют ту же реализацию. Шаблоны могут быть частично специализированы:
template<class T>
struct TwoImplementations {
int m_nIntMember;
};
template<>
struct TwoImplementations< const T > {
double m_fDoubleMember;
};
Выполнение переинтерпретировать ввергнуть между TwoImplementations<int>
и TwoImplementations<const int>
просто неправильно.
Никогда не используйте такой reinterpret_cast, особенно в этом случае! Вообще говоря, reinterpret_cast на 99% не переносится. – rmn
Я знаю это и признаю это в своем посте. Поэтому, пожалуйста, не делайте снизу. Это языковая функция, она может работать и в 1% случаев может быть даже полезной. – Sebastian
@rmn: Один размер не подходит всем, я согласен, что в этом месте это плохая идея, но никогда не говори никогда. –
Вы можете использовать метод get() для получения базового символа char *, который автоматически конвертируется в const char *, но не назначает его другому shared_array, потому что тогда вы дважды удалите данные. Просто используйте его так, как вам нужно.
так:
boost::shared_array<char> x(new int[13]);
const char *y = x.get();
Я бы не подумал об этом, не удивительный ответ Кирилла, но вы можете эффективно продлить static_pointer_cast
форсирования, который используется для shared_ptr
s для работы на shared_array
с таким образом:
template<typename OriginalType>
struct SharedPtrCastHelper
{
public:
SharedPtrCastHelper(const OriginalType & ptr) : ptr(ptr) {};
template<typename T> void operator()(T*) {}
protected:
OriginalType ptr;
};
template<typename OutT, typename InT>
boost::shared_array<OutT>
static_pointer_cast(const boost::shared_array<InT> & inSharedPtr)
{
typedef SharedPtrCastHelper<boost::shared_array<InT> > Helper;
return boost::shared_array<OutT>((OutT*)inSharedPtr.get(),
Helper(inSharedPtr));
}
с этим вы можете сделать что-то вроде:
boost::shared_array<int> intArrayPtr(new int[40]);
boost::shared_array<unsigned int> uintArrayPtr;
uintArrayPtr = static_pointer_cast<unsigned int>(intArrayPtr);
- 1. reallocating boost :: shared_array
- 2. Работа с boost :: shared_array
- 3. C++/boost: объявление инкапсулированного shared_array
- 4. Данные внезапно удаляются из Boost shared_array/ptr
- 5. Почему явный конструктор boost :: shared_array вызывает ошибку?
- 6. Как установить ожидание для boost :: shared_array
- 7. boost :: shared_array присваивает приложения сбой (VC++ 2010)
- 8. Qt умный указательный эквивалент boost :: shared_array?
- 9. Преимущества использования BOOST shared_array over shared_ptr
- 10. boost :: shared_array и выделенное выделение памяти
- 11. Элемент shared_array как shared_ptr?
- 12. Имеет ли смысл использовать std :: shared_ptr <std::vector> вместо boost :: shared_array?
- 13. boost :: shared_ptr <const T> to boost :: shared_ptr <T>
- 14. Сравнение boost :: optional <T&> to const T &
- 15. Есть ли лучший способ выделения/копирования shared_array
- 16. Boost smart array не работает
- 17. boost :: variant implicit cast to string
- 18. Do boost :: shared_ptr <T> и boost :: shared_ptr <const T> поделиться ссылкой счетчик?
- 19. Cast boost :: units type to numeric types
- 20. boost shared_from_this <>()
- 21. Boost :: binary <>
- 22. 'boost :: exception_detail :: clone_impl <boost :: exception_detail :: error_info_injector <boost :: system :: system_error>>
- 23. BOOST UnitTest переопределение оператора <<
- 24. boost :: exception_detail :: clone_impl <boost :: exception_detail :: error_info_injector <boost :: thread_resource_error>>
- 25. Назначение const boost :: shared_ptr <T> & as аргумент функции?
- 26. Boost :: bind метод с boost :: function parameter
- 27. Тип boost :: future <> from boost :: async()
- 28. Сравнение (<), вывод (<<) и присвоение (=) для boost :: optional
- 29. shared_ptr и shared_array выделяют память для счетчика ссылок
- 30. Инициализация boost :: shared_ptr <std :: vector <T>> with boost :: shared_ptr <std::list<T>>
Почему вы думаете, что нужно сделать это? – 2009-12-04 12:43:11