如何习惯性地将“字符*”转换为“双倍*”
How to idiomatically convert ``char*`` to ``double*``
我正在重新学习C++,我正在尝试使用boost::iostreams::mapped_file
。此类将文件数据映射到char*
,我想将其转换为double*
(因为我正在使用双打)。
我可以使用 C 样式的强制转换:double* foo = (double*) data
来铸造它,但我正在尝试使用惯用C++,C++偏爱C++转换,例如:static_cast
等等。
我想出了:
double* data = static_cast<double*>((void*)file.data());
(文件>数据返回char*
)。这真的不干净。
这是我正在尝试做的(这段代码有效!
BOOST_AUTO_TEST_CASE(OpenMMapArray){
typedef boost::multi_array_ref<double, 3> arrayd3;
typedef std::array<size_t, 3> index3d;
index3d shape = {{ 20, 20, 20 }};
size_t size = sizeof(double)*std::accumulate(shape.begin(), shape.end(), 1, std::multiplies<size_t>());
boost::iostreams::mapped_file file;
boost::iostreams::mapped_file_params params;
params.path = "/tmp/mmaptest-2";
params.mode = std::ios::in | std::ios::out;
params.new_file_size = size;
file.open(params);
double* data = static_cast<double*>((void*)file.data());
arrayd3 array(data, shape);
array[0][0][0] = 20;
array[0][1][0] = 19;
array[1][0][0] = 18;
array[0][0][5] = 17;
BOOST_CHECK(data[0] == 20);
BOOST_CHECK(data[20] == 19);
BOOST_CHECK(data[20*20] == 18);
BOOST_CHECK(data[5] == 17);
file.close();
}
在这种特殊情况下,您实际上是在尝试将数据重新解释为不同的类型。因此,reinterpret_cast
是有序的:
double* data = reinterpret_cast<double*>(file.data());
相关文章:
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将包含指数的 QString 转换为C++中的双倍?
- 将双倍转换为 LPARAM 的麻烦
- 如何将标准::string_view转换为双倍?
- 错误:无法在赋值中将"双 ()(双)抛出 ()"转换为"双倍"
- 将双倍转换为字符数组C++
- 从双倍到时间的转换
- 如何将标准::时间::d转换为双倍(秒)?
- 缩小从字符到双倍的转换
- 使用霍华德·欣南特的日期库将双倍转换为zoned_time
- 将词法强制转换双倍提升为字符串,给出无效结果
- 它不是编译.我正在调用一个通过引用调用的函数,但有一个错误,无法将双*转换为双倍
- 如何避免警告C4244:从'ULONGLONG'转换为"双倍",可能丢失数据
- 如何在C++中从尾数和指数转换为双倍
- C++ 将双倍转换为字符并替换为标准::数组
- 数据类型在 CPP 中将 int 转换为双倍
- 使用 QList 将 Qstring 转换为双倍
- 如何习惯性地将“字符*”转换为“双倍*”
- 精确地将双倍转换为mpf_class