2017-02-05 2 views
1

이진 파일을 읽는 데 2 ​​개의 함수가 있습니다.매개 변수 팩 확장 순서

첫번째 기능은 파일에서 sizeof(T) 바이트를 읽습니다

template<typename T> 
T read() { ... some IO operations ... }; 

2 기능은 각 템플릿 매개 변수를 사용하여 첫 번째 여러 번 호출

template<typename... Ts> 
std::tuple<Ts...> read_all() { 
    return std::make_tuple(read<Ts>()...); 
}; 

모든 것이 1 차 함수 호출 순서를 제외하고 잘 작동합니다.

uint32_t a; 
uint8_t b; 
std::tie(a, b) = read_all<uint32_t, uint8_t>(); 

같은 들어 첫 번째 read<uint8_t>()라고 할 것이다 통과 템플릿 매개 변수의 순서를 반전 및 파일의 바이트 순서로 엉망이 read<uint32>() 후.

확실히, 나는 템플릿 인수의 역순으로 전화하여 read_all을 호출 할 수 있으며 결국에는 올바른 순서로 표시 할 수 있지만 더 확실한 방법이 있습니까?

답변

8

C++은 함수의 인수가 평가되는 순서를 지정하지 않습니다. 함수에 대한 표현식이 모두 스트림의 데이터를 사용하면 잘못된 순서로 객체를 읽는 동작을 얻을 수 있습니다. 왼쪽에서 오른쪽으로

브레이스 이니셜 라이저 목록은 당신이 더 나은 결과를 얻을해야하므로, 그러나, 당신은 같은 것을 시도하는 경우에 평가된다 : 나는 마음에 계속됩니다

template<typename... Ts> 
std::tuple<Ts...> read_all() { 
    return std::tuple<Ts...>{read<Ts>()...}; 
} 
1

나는 조금 간단하게 유지하고 이런 짓을 했을까 :

uint32_t a; 
uint8_t b; 
std::tie(a, b) = read<std::tuple<uint32_t, uint8_t>>(); 

이 방법은 하나의 read()가 그리고 당신은 튜플 (또는 구조체)를 사용하는 경우에도 직접 필드를 tie()를 건너 뛸 수 있습니다.

+0

을, 감사 –