6

我怎样才能boost::shared_array<char>投到boost::shared_array<const char>

4

7 回答 7

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) );
于 2009-12-04T13:08:38.523 回答
3

其他答案是正确的,你不能也不应该。

此外,您确定要 aboost::shared_array<const char>而不是 aconst 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>在and之间进行重新解释TwoImplementations<const int>是错误的。

于 2009-12-04T12:41:06.257 回答
1

你不能。

由于这两种类型都基于模板,因此两种类型对于编译器来说是完全不同的。

于 2009-12-04T12:35:39.947 回答
1

我认为你不能。如果你真的需要它,你可以创建一个自定义的智能指针类。可以在此处找到相关提示。

于 2009-12-04T12:40:50.017 回答
1

您可以使用 get() 方法获取底层 char*,它可以自动转换为 const char* - 但不要将其分配给另一个 shared_array,因为这样您将删除数据两次。只需根据需要使用它。

像这样:

boost::shared_array<char> x(new int[13]);
const char *y = x.get();
于 2009-12-04T12:43:57.437 回答
1

如果没有 Kirill 的出色回答,我不会想到这一点,但是您可以有效地将static_pointer_cast用于s 的 boost 扩展为在shared_ptrs 上工作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 );
于 2011-07-22T04:15:35.393 回答
0

这种编译器生成的强制转换是不可能的。

由于模板专业化特性,具有 const 限定模板参数的类的内部结构可能与没有它的类有很大不同。

此外,使用此类功能有时是编译时检查的背景,这可能仅允许在类型正确A<const T>的每种情况下都实例化类型。A<T>

于 2009-12-04T12:37:05.573 回答