오랜만에 C++ 코드를 작성하고 있습니다. C#으로 WPF/Silverlight 만 다루다가 오랜만에 C++로 ATL/COM을 만지려고 하니 사소한 것에서 난관이 많네요. 툴도 바뀌기도 했고 말이죠. 오랜만에 C++을 쓰다보니 새로 알게 되는 지식도 생기는군요.
Visual C++ 2010 에서는 STL 컨테이너에 대해서 for each, in 구문을 사용할 수 있다는 걸 알게되었습니다. (MSDN 문서 항목을 보면 2005 버전부터 존재하긴 합니다.)
도입된 목적은 역시 C++/CLI 에서 IEnumerable 등의 형식을 순차적으로 처리할 때 C#의 foreach, in 구문과 동일하게 쓰기 위한 것으로 보입니다. 하지만 C++/CLI가 아닌 win32 프로그래밍에서 STL 컨테이너에 대해서도 사용할 수 있는 것이지요.
Visual C++ 2010 에서는 c++0x 표준안의 일부가 이미 포함되어 있기에 아래와 같이 별로 C++ 스럽지 않은 코드가 나오게 됩니다. (c++0x는 이제 ISO C++ 표준으로 승인이 되어 C++11 이라고 부르는 것이 정식입니다.)
std::<CString, CString> _uriMap; std::list<CString>&& candidates = GetUriMappingCandidates(uri); // r-value reference CString foundKey; CString foundValue; for each (auto c in candidates) { auto it = _uriMap.find(c); if (it != _uriMap.end()) { foundKey = it->first; foundValue = it->second; break; } }
C++11의 auto 키워드와, 비록 비표준 키워드이긴 하지만 for each 를 써주니까 STL 컨테이너를 두 가지나 사용하고 있는데도 예전처럼 콜론과 부등호가 난무하지 않고 코드가 깔끔해보여서 좋네요.