簡體   English   中英

我可以在這里使用reinterpret_cast嗎?

[英]Can I use a reinterpret_cast here?

簡化后,我有以下類模板:

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

當我不知道它們的類型T時,許多這些Buffer是從文件生成的,並存儲到數組中。

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&b),然后在返回后調用move構造函數。 對?

您可以使用以下內容:

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. reinterpret_cast是顯而易見的選擇,因為這就是我們正在做的:重新解釋存儲在char*的位模式,就好像它是T*
  2. 這里沒有內置的強制轉換是一個好主意。 Buffer<char>Buffer<T>不相關。 沒有任何關於其布局兼容性的保證(或者至少您需要非常仔細地定義它們以確保布局兼容性)。 char*比其他指針更長的平台上,這很可能很難解決。

一種可能的處理方法是:

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

另一種方法是交叉類型復制Buffer<T>如其他答案所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM