9-4. 템플릿 메타 프로그래밍2

그렇다면 TMP 를 사용해 왜 복잡하게 프로그래밍을 할까? 어떤 파워가 있는 것일까?

단위(Unit) 라이브러리

  • 물리적 수치 계산 시 꼭 필요한 것이 바로 단위이다.

  • 떄문에, 단위가 붙은 데이터를 처리할 때 중요한 점은 바로 데이터를 연산할 때 항상 단위를 확인해야 된다는 점이다.

  • 아래 코드는 v1, v2 가 같은 단위이기 때문에, 더 할 수 있다. -> 여기서 더 할 수 있다는 것은 물리적으로 더한 값이 말이 된다는 의미이다.

float v1, v2;  // v1, v2 는 속도
std::cout << v1 + v2;
  • 반면에 아래와 같이 두 변수의 단위가 다르다면 v + a 는 불가능한 연산이다.

    • 컴파일러 입장에서는 단위를 고려하지 않기 때문에, 에러가 발생하지는 않는다.

    • 하지만, 실제로 동작하게 되면 골치아픈 문제가 발생한다. (NASA 의 경우 단위를 잘못 계산해 1조원까지 화성 탐사선을 날려먹었다..)

float v;        // 속도; m/s
float a;        // 가속도; m/s^2
std::cout << v + a;  // ???
  • 이 상황에서 가장 이상적인 방법은 단위가 맞지 않는 연산을 수행하는 코드가 있다면, 컴파일 에러를 발생시키는 것이다.

  • 이를 위해서 다음과 같은 클래스를 생성해보자.

    • Dim 클래스는 어떠한 데이터의 단위를 나타내기 위해서 사용한다.

    • 어떠한 물리량의 단위를 나타내기 위해서는 무게(kg), 길이(m), 시간(s) 이 3 개로 나타낼 수 있다.

    • 예를 들어서 속도의 경우 m/s 이므로, 저 Dim 클래스로 표현하자면 Dim<0, 1, -1> 로 나타낼 수 있다. 왜냐하면 m/s = kg^0 m^1 s^-1 이기 때문이다.

    • 마찬가지로 힘의 경우 단위가 kg m /s^2 이므로 Dim 클래스로 표현하자면 Dim<1, 1, -2> 가 된다.

  • 하지만 Dim 의 경우 템플릿 인자로 받기 때문에, 아래와 같이 사용자 정의 타입을 넣어 사용할 수 있다.

  • 그렇다면 아래와 같이 Dim 끼리 더하고, 빼는 템플릿 클래스도 아래와 같이 만들 수 있을 것이다 .

    • typename 이 이렇게 만이 들어가는 이유는 M 의 경우는 U 와 V 에 의존한 타입이고,

    • type 역시 M 과 V 에 의존한 타입이기 때문이다.

  • 자 이제, 실제 데이터를 담는 클래스를 만들어보자.

...

일단 너무 복잡해서 스탑 ;;

Last updated