将boost :: shared_array <char>强制转换为boost :: shared_array <const char =“”> </const> </char>

时间:2009-12-04 12:27:32

标签: c++ boost smart-pointers casting

如何将boost::shared_array<char>投射到boost::shared_array<const char>

7 个答案:

答案 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}}类型的实例化是不正确的。