Post List

2015년 1월 14일 수요일

decltype

decltype (Visual Studio 2010부터 사용가능)
주어진 표현식의 타입을 컴파일러가 직접 추론하도록 지시하는데 사용한다.
auto 와 같이 사용하면서 함수의 return 타입을 결정하는데 사용하면 편리하다.

auto add(int a, int b) { return a + b; }

위 Code는 컴파일되지 않는다. (2015에서는 정상적으로 컴파일 된다.)
이럴때 -> 를 이용하여 별도로 return 타입을 지정해주는 방법도 있다.

auto add (int a, int b) -> int { return a + b; }

하지만 저렇게 쓰는건 그냥 앞에 int 붙이는거보다 더 불편해 보인다.
이럴 경우 decltype를 사용해서 return 타입을 추론 할 수 있다.

auto add (int a, int b) -> decltype(a + b) { return a + b; }

하지만 위와 같이 안쓰고 그냥 template를 사용하면 된다고 생각할 수 있다.

template <typename T>

T add(T aT b) { return ab;  }

맞다. 그렇게 해도 된다. 하지만 파라미터 타입과 return 타입이 다를 수도 있고, return 타입이 정해지지 않는 경우도 존재한다. 이럴 경우 기존 C++ 문법으로는 구현하기 어렵다.

function pointer를 파라미터를 받을 때 해당 함수마다 return 타입이 다른 경우 auto 와 decltype을 이용하면 해결이 가능하다.

#include <atlstr.h>

template <typename T, typename F>
auto execute(const T& value, F func) -> decltype(func(value))
{
        return func(value);
}

CString Num2Str(const int i)
{
        CString str;
        str.Format(_T("%d"), i);
        return str;
}

int Str2Num(const CString& s)
{
        return _ttoi(s);
}

void main()
{
        int i = execute(_T("100"), Str2Num);
        CString s = execute(200, Num2Str);
}

execute()라는 템플릿 함수를 정의했고, auto decltype를 이용하여 다른 return 타입을 가지는 함수를 매개변수로 받아서 처리를 할 수 있다.

decltype는 명시적인 타입 지정 상황에서는 그다지 효용성이 없지만, 템플릿 함수를 동반하는 generic 코드를 작성할 때는 간단하게 구현이 가능하다.

참고 : C++ 핵심 노트 이주한 (한빛미디어)

댓글 없음:

댓글 쓰기