【问题标题】:How to idiomatically convert ``char*`` to ``double*``如何习惯性地将 ``char*`` 转换为 ``double*``
【发布时间】:2014-02-26 20:37:56
【问题描述】:

我正在重新学习 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&lt;&gt;,或者更好的是,避免使用原始指针(如果可能的话)
  • 对不起,不:这reinterpret_cast&lt;double*&gt;(file.data())char*只是说'任意数量的字节'。跨度>
  • @Drop ' 避免使用原始指针 ...' 只要您声称使用序列化,而不是存储原始二进制格式,我同意。
  • 好吧,我会把它装进boost::multi_array_ref&lt;double, 3&gt;,但我需要先把它装进double*

标签: c++ boost casting static-cast


【解决方案1】:

在这种特殊情况下,您实际上是在尝试将数据重新解释为不同的类型。所以reinterpret_cast 是有序的:

double* data = reinterpret_cast<double*>(file.data());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多