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% 정확한 것은 아니다. 타입 추론 규칙에 대해서 잘 알고 있는 것이 중요하다. |
댓글 없음:
댓글 쓰기