프로그래밍/Effective STL
[effective STL] 항목 06 : C++ 컴파일러의 어이없는 컴파일 조심!
엘레멘탈키스
2015. 9. 5. 01:08
728x90
728x90
예시
int 데이터가 들어 있는 파일을 가지고 있고, int를 vector에 복사한다고 가정한다.
1 2 3 4 | std::ifstream dataFile("ints.txt"); std::vector<int> data(std::istream_iterator<int>(dataFile), std::istream_iterator<int>()); | cs |
그럼 이런 코드가 생성될 수가 있다.(이렇게 복잡한 코드가...............)
실제로 구현을 해보니
data 자체를 백터로 인식조차 하지 못했다. data라는 이름의 함수로 인식.
이유인 즉슨,
첫 번째 매개 변수는 dataFile이란 이름을 가진다. 타입은 istream_iterator<int>이고
dataFile을 둘러싼 괄호는 컴파일러가 무시한다.
두 번째 매개 변수는 이름을 가지고 있지 않다. 타입은 아무 것도 받아들이지 않고
istream_iterator<int>을 반환하는 함수 포인터이다.
해결(?)
첫 번째 인자에 괄호 한 쌍을 쳐주면 해결된다.
하지만........... 모든 컴파일러가 똑같이 동작하진 않는다.
다시 해결
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <iostream> #include <fstream> #include <vector> #include <iterator> // istream_iterator void main() { std::ifstream dataFile("ints.txt"); /* std::vector<int> data((std::istream_iterator<int>(dataFile)), std::istream_iterator<int>()); */ std::istream_iterator<int> dataBegin(dataFile); std::istream_iterator<int> dataEnd; std::vector<int> data(dataBegin, dataEnd); for (int i : data) { std::cout<<data.at(i); } // 책엔 없지만 닫아주는게 당연하니.. dataFile.close(); } | cs |
15~17라인처럼 하면 된다.
이름이 붙은 반복자 객체를 사용하는 방법은 STL 프로그래밍 스타일에 반하는 것이다.
하지만 컴파일러와 프로그래머 모두에게 혼란을 주는 코드는 사용하면 않는 것이 좋다.
728x90
반응형