如何将boost::shared_array<char>
投射到boost::shared_array<const char>
?
答案 0 :(得分:6)
由于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) );
答案 1 :(得分:3)
其他答案是正确的,你不能也不应该。
此外,您确定要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);
但这不是一个好主意,只有当boost :: shared_array和boost :: shared_array具有相同的实现时才有效。模板可以部分专业化:
template<class T>
struct TwoImplementations {
int m_nIntMember;
};
template<>
struct TwoImplementations< const T > {
double m_fDoubleMember;
};
在TwoImplementations<int>
和TwoImplementations<const int>
之间进行重新解释是错误的。
答案 2 :(得分:1)
你不能。
由于这两种类型都基于模板,因此编译器的两种类型都完全不同。
答案 3 :(得分:1)
我想你不能。如果你真的需要它,你可以创建一个自定义智能指针类。可以找到here的提示。
答案 4 :(得分:1)
您可以使用get()方法获取底层char *,它可以自动转换为const char * - 但不要将其分配给另一个shared_array,因为这样您将删除两次数据。只需在需要时使用它。
像这样:boost::shared_array<char> x(new int[13]);
const char *y = x.get();
答案 5 :(得分:1)
如果没有Kirill的精彩答案,我不会想到这一点,但你可以有效地扩展用于static_pointer_cast
的boost shared_ptr
来处理shared_array
s,因为:< / p>
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 );
答案 6 :(得分:0)
这种编译器生成的转换是不可能的。
由于模板特化功能,具有const限定模板参数的类的内部可能与没有一个的类有很大不同。
此外,使用这样的功能有时候是编译时检查的背景,仅仅A<const T>
类型的A<T>
类型的{{1}}类型的实例化是不正确的。