【发布时间】:2014-07-14 10:08:00
【问题描述】:
简化,我有以下类模板:
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),返回后调用移动构造函数。对吗?
【问题讨论】:
-
C 风格的演员表从来都不是一个好主意。
-
@n.m.:OP 声明它是 C++ 演员之一的占位符。
-
为什么首先是
char * ptr;,而不是T * ptr;? -
对于 Mark2,为什么不创建一个特定的构造函数?
-
为什么是char * ptr?对,我也可以使用 T * ptr。但是,尽管如此,我还是必须强制转换,因为首先我将缓冲区作为纯字符从文件中加载,而不知道它的实际类型。稍后,我将使用 getBuffer(...) 来获取具有正确类型的缓冲区。
标签: c++ casting type-conversion reinterpret-cast