简化,我有以下课程模板:
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):
答案 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)
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>
,如另一个答案所示。