[英]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):
您可以使用以下內容:
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];
}
reinterpret_cast
是顯而易見的選擇,因為這就是我們正在做的:重新解釋存儲在char*
的位模式,就好像它是T*
。 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.