我可以在这里使用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风格的强制转换作为占位符。)
标记(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];
}
-
reinterpret_cast
是这里明显的选择,因为这就是我们正在做的:重新解释存储在char*
中的位模式,就好像它是T*
一样。 - 这里没有内置cast是一个好主意。
Buffer<char>
和Buffer<T>
不相关。它们的布局兼容性没有任何保证(或者至少您需要非常仔细地定义它们以确保布局兼容性)。在char*
比其他指针长的平台上,这可能会严重破坏。
一种可能的处理方法是:
class Buffer{
char * ptr;
template <typename T>
T * getPtr() {return reinterpret_cast<T*>(ptr);}
};
另一种方法是交叉复制Buffer<T>
,正如另一个答案所建议的那样。
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障
- C++ const-cast 一个引用