Post List

2015년 3월 25일 수요일

item 04: 타입 추론 결과를 확인 할 수 있는 방법

작가
Meyers, Scott
출판
O'ReillyMedia
발매
2014.12.12
평점








Effective Modern C++ - Scott Meyers
Item 4 : Know how to view deduced types.

item 4. 타입 추론 결과를 확인 할 수 있는 방법

타입 추론 (Type decucing) 된 결과를 확인 할 수 있는 방법은 크게 3가지가 있다.
방법으로도 3가지이지만, 시기적으로도 각각 다르다.

1. IDE Editor를 사용 (Coding 시 확인 가능)

 요즘 IDE들이 워낙 잘 나와서 마우스만 위에 올려도 추론된 결과를 다 알려준다.


2. Compiler Diagnostics (Compile 할때 확인 가능)

 컴파일 단계에서 에러로 추론 결과를 알려준다.



3. Runtime Output (실행 중에 확인 가능)

 실행중에 printf 나 std::cout 등을 이용하여 확인이 가능하다.
 가장 쉬운 방법은 typeid 와 std::type_info::name 을 이용하는 방법이다.

const int CI = 42;
auto x = CI;
auto y = &CI;

std::cout << typeid(x).name() << std::endl; // int
std::cout << typeid(y).name() << std::endl; // int const *

결과는 Compiler마다 조금 다르게 출력해 줄수도 있다.
MS사의 Visual Studio는 친절하게 타입을 알려주지만, GCC는 좀 다르게 표시되기도 한다.
예를 들어서 y에 대한 결과를 PKi로 표시한다. (pointer to const int)

조금 더 복잡한 예제를 한번 보자.

class Widget {
public:
Widget(int p) : i(p) {}
int i;
};

template<typename T>
void f(const T& param)
{
cout << "T =     " << typeid(T).name() << endl;
cout << "param = " << typeid(param).name() << endl;
}

std::vector<Widget> createVec()
{
return std::vector<Widget> { 1, 2, 3, 4 };
}

const auto vw = createVec();

if (!vw.empty())
{
f(&vw[0]);
}

T     = class Widget const *
param = class Widget const *

결과는 이와 같이 나왔다.
param의 타입은 const T& 인데, T와 타입이 같다는 것이 이상하다.
item 1에서 타입추론에 대해서 설명한 방법과 똑같은 방법으로 추론을 했기 때문이다.
이 결과는 옳다고 해야 할지 아니라고 해야 할지...

더 확실한 결과가 필요하다면 Boost.TypeIndex 라이브러리를 사용하면 된다.

#include <boost/type_index.hpp>


template<typename T>
void f(const T& param)
{
    using namespace std;
    using boost::typeindex::type_id_with_cvr;

    cout << "T = "     << type_id_with_cvr<T>().pretty_name() << endl;
    cout << "param = " << type_id_with_cvr<decltype(param)>().pretty_name() << endl;
}

T = class Widget const *
param = class Widget const * const &


Things to Remember

* 타입추론 결과를 알 수 있는 방법으로는 IDE, Compiler의 Error Message, Run-time에서의 Boost.TypeIndex 등의 라이브러리를 이용하는 방법이 있다.

* 위 도구들을 이용하여 확인한 결과가 100% 정확한 것은 아니다.
  타입 추론 규칙에 대해서 잘 알고 있는 것이 중요하다.