2014-02-26 155 views
3

我正在重新學習C++,並試圖與boost::iostreams::mapped_file一起工作。這個類將文件數據映射到char*,我想將它投射到double*(因爲我正在使用雙打)。如何將``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(); 
} 
+0

使用'的reinterpret_cast <>',甚至更好,避免原始指針(如果可能) – Drop

+2

很抱歉,沒有:這是** **一個'的reinterpret_cast (file.data ())','char *'只是說_任意數量的字節__。 –

+0

@Drop _'避免原始指針......'只要你聲稱使用序列化,而不是存儲原始二進制格式,我同意。 –

回答

6

在這種特殊情況下,你實際上是在試圖重新解釋數據爲不同的類型。因此reinterpret_cast是爲了:

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