문제

C ++를 다시 열고 boost::iostreams::mapped_file로 작업하려고합니다.이 클래스는 파일 데이터를 char*에 매핑합니다. double* (복식 작업 이후)로 캐스팅하고 싶습니다.

C 스타일의 CAST : double* foo = (double*) data를 사용하여 캐스팅 할 수 있지만 관용구 C ++ 사용을 시도하고 C ++는 C ++ CASTS가 다음과 같습니다. 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());
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top