我可以在这里使用reinterpret_cast吗?

时间:2014-07-14 10:08:01

标签: c++ casting type-conversion reinterpret-cast

简化,我有以下课程模板:

template<class T> class Buffer{
  char * ptr;
  T * getPtr(){return (T*)ptr;} // (1) Which cast to use ?
}

当我还不知道它们的类型T时,会从文件生成许多这些缓冲区并存储到数组中。

Buffer<char> buffers[10];
do_something_to_load_buffers_from_file();

最后,当我知道他们的类型时,我希望通过函数返回值:

template<class T> Buffer<T> getBuffer(int i){
  return (Buffer<T>)buffers[i]; // (2) Which cast to use ?
}
...
Buffer<int> ibuf = getBuffer<int>(5);

现在的问题是:我在标记的线条上使用哪些演员表? (我故意在给定的例子中使用C风格演员作为PLACEHOLDER。)

马克(1): 重新解释演员应该在这里做正确的事,这是真的吗?

马克(2):

  • 重新诠释演员也会在这里完成这项工作,但这是一个好习惯吗?
  • 我的一般理解:这一行首先调用转换构造函数Buffer(Buffer&amp; b),返回后调用move构造函数。正确?

2 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

template<class T> class Buffer{
  char * ptr;
  T * getPtr(){return reinterpret_cast<T*>(ptr);}

  template<typename U>
  Buffer(const Buffer<U>& rhs) : ptr(rhs.ptr) {}
};

等等:

template<class T> Buffer<T> getBuffer(int i){
  return buffers[i];
}

答案 1 :(得分:3)

  1. reinterpret_cast在这里是显而易见的选择,因为这就是我们正在做的事情:重新解释存储在char*中的位模式,好像它是T*
  2. 这里没有内置演员是个好主意。 Buffer<char>Buffer<T>无关。关于它们的布局兼容性没有任何保证(或者至少需要非常仔细地定义它们以确保布局兼容性)。在char*比其他指针更长的平台上,这很可能会破坏。
  3. 处理它的一种可能方法是:

    class Buffer{
      char * ptr;
      template <typename T>
      T * getPtr() {return reinterpret_cast<T*>(ptr);}
    };
    

    另一种方式是跨类型复制Buffer<T>,如另一个答案所示。