C++0x 미리보기 11, auto의 새로운 용법

Twitter icon류광, 2009-05-08 20:05
타이핑과 삽질을 줄이는 auto(의 새로운 용법)를 소개합니다.

아마도 C++0x에서 가장 인기 있는 기능이 auto일 것입니다. auto를 잘 말해주는 예로, 현재(C++03)는

for (vector<string>::const_iterator it = v.begin(); it!=v.end(); ++it)

라고 써야 하는 것을 C++0x에서는

for (auto it = v.begin(); it!=v.end(); ++it)

라고 쓸 수 있습니다. (물론 이런 루프라면 범위 기반 for를 사용하는 게 더 낫겠지만요.)

그런데 이 예는 “타이핑 줄이기”에 해당합니다. 즉, 답을 알긴 알지만(STL을 적극적으로 사용하는 프로그래머라면 v.begin()의 반환 형식을 이미 외우고 있겠지요) 적기가 귀찮을 뿐인 상황입니다. auto는 이런 단순한 타이핑 줄이기보다는, 답 자체를 알아내거나 표현하는 게 힘든 상황에서 더욱 빛을 발합니다. 예를 하나 들자면(http://www.research.att.com/~bs/C++0xFAQ.html#auto에서 인용):

template<typename T, typename U>
void f(const vector<t>& vt, const vector<u>& vu)
{
    // ...
    auto tmp = vt[i]*vu[i];
    // ...
}

auto가 없다고 할 때, 임의의 형식의 두 값을 곱한 결과의 형식을 표현하려면 템플릿 메타프로그래밍이 필요합니다. 이를테면:

    typename ProductType<T,U>::type tmp = vt[i]*vu[i];

두 형식의 곱의 가장 자연스러운 형식을 돌려주는 ProductType<T,U>라는 메타 함수를 만드는 게 아주 어려운 일은 아니겠지만, 코드에서 하고자 하는 일의 간단함에 비하면(그냥 두 수의 곱을 구하는 것일 뿐인데!) 좀 과하지 않을까요. Boost에 이미 있을 수도 있습니다만...

심지어, TU가 명시적으로 드러나 있다고 해도 쉽지가 않습니다. 다음에서 ???는 무엇이 되어야 할까요?

void f(const vector<int>& a, vector<float>& b)
{
    // ...
    ??? tmp = vt[i]*vu[i];
    // ...

intfloat을 곱한 결과를 최대한 정확하게 보존하되 메모리를 너무 낭비하지는 않은 형식이 무엇인지를 알려면 C++ 표준도 봐야 하고 구체적인 컴파일러의 문서화도 봐야 할 것입니다. 그러나 auto가 지원된다면 고민할 필요가 없습니다.

auto의 유용함은 이 정도로 하고, 몇 가지 세부적인 사항들을 이야기하자면:

void f()
{
    auto int i = 0; // C++0x에서는 오류

    //...
}

다음 회에서는 auto의 형제라 할 수 있는 decltype을 다루겠습니다.

태그: C++ C++0x

comments powered by Disqus

예전 댓글(읽기 전용)