본문 바로가기
프로그래밍/Modern Effective C++

Item 4. 추론된 타입 확인 방법

by drogrammer 2021. 8. 31.
반응형

아래 포스팅들을 통해 템플릿 타입 추론 및 Auto 타입 추론을 확인해 보았다. 이번 포스팅에서는 실제로 의도한대로 추론되었는지 확인할 수 있는 방법들을 소개한다.

 

Item 1. 템플릿 타입 추론

C++ 템플릿이 타입을 어떻게 추론하는지 그 법칙을 알아보자. 1. 템플릿 일단, 템플릿이 뭐지? 라는 분을 위해 간략히 설명 하자면, 템플릿은 Generic 프로그래밍을 위해 C++ 이 제공하는 장치로, 변

drogrammer.tistory.com

 

 

Item 2. Auto 타입 추론

C++에서 Auto 타입이 어떻게 추론되는지 알아보자. 1. Auto Auto 는 변수 초기화시에 자동으로 타입이 추론 되는 타입이다. 예를 들어 아래와 같은 코드는 변수 i를 int 타입으로 추론한다. auto i = 10; C++

drogrammer.tistory.com

 

1. IDE 를 이용해서 확인

일반적으로 IDE 상에서 확인이 가능한데, VSCode 의 경우 관련 함수 혹은 변수에 마우스를 올려두면 확인이 가능하다.

1.1. 템플릿 추론의 경우

template <typename T>
void r(T& a) {}

int main() {
  int i = 1;
  int& ir = i;
  const int ci = 1;
  const int& cir = ci;

  r(i);    // int& 으로 추론
  r(ir);   // int& 으로 추론
  r(ci);   // int const& 으로 추론
  r(cir);  // int const& 으로 추론

  return 0;
}

위 코드를 vscode에서 작성 후, 마우스를 r 함수 위에 가져가 보면 아래와 같이 추론된 함수 원형을 확인 가능하다.

템플릿 타입 추론 확인 (vscode)

 

1.2. Auto 추론의 경우

int main() {
  int i = 1;
  int& ir = i;

  auto& ai = i;           // int& 로 추론
  auto& air = ir;         // int& 로 추론
  const auto& cai = i;    // int const& 로 추론
  const auto& cair = ir;  // int const& 로 추론

  return 0;
}

위 코드를 vscode에서 작성 후, 마우스를 auto로 선언된 변수위에 가져가 보면 아래와 같이 추론된 타입을 확인 가능하다.

Auto 타입 추론 확인 (vscode)

 

2. 컴파일 에러를 이용해서 확인

템플릿 클래스를 선언만 해두고 정의하지 않아서 강제로 컴파일 에러를 발생 시킨 후 확인하는 방법인데.. 실용적인것 같지 않은데 왜 책에서 설명했는지 모르겠다...;; 

암튼, 아래 처럼 템플릿 클래스를 선언하고, 사용하게 코드를 작성한 후 컴파일 해보면,

template <typename T>
class TD;

int main() {
  int i = 1;
  int& ir = i;

  auto& ai = i;         // int& 로 추론
  const auto& cai = i;  // int const& 로 추론

  TD<decltype(ai)> aiType;
  TD<decltype(cai)> caiType;

  return 0;
}

아래와 같은 에러를 볼 수 있는데, 에러 메시지에서 각 변수의 추론 타입을 확인 할 수 있다.

컴파일 에러 메시지

 

3. 런타임에 확인

책에 typeid 혹은 boost의 type_id_with_cvr 을 활용하는 방법이 잘 설명되어 있었으나 typeid는 readability가 떨어지고 boost는 외부 라이브러리 의존성이 생겨서 불편하다. 

그래서 열심히 구글링을 해보다가 찾아낸 방법을 아래 포스팅에 정리해 두었으니 참고하기 바란다.

 

 

Tip: 변수의 타입 출력하기

C++ 에서는 템플릿, auto 등을 통해 타입추론이 많이 사용되므로 실제 추론된 타입이 무엇인지 궁금할떄가 많다. 아래 스택오버플로우에서 관련 마음에 드는 방법을 찾아서 공유하고자 한다. (C++11

drogrammer.tistory.com

 

 

반응형

댓글