9-4. 템플릿 메타 프로그래밍2
그렇다면 TMP 를 사용해 왜 복잡하게 프로그래밍을 할까? 어떤 파워가 있는 것일까?
단위(Unit) 라이브러리
물리적 수치 계산 시 꼭 필요한 것이 바로 단위이다.
떄문에, 단위가 붙은 데이터를 처리할 때 중요한 점은 바로 데이터를 연산할 때 항상 단위를 확인해야 된다는 점이다.
아래 코드는 v1, v2 가 같은 단위이기 때문에, 더 할 수 있다. -> 여기서 더 할 수 있다는 것은 물리적으로 더한 값이 말이 된다는 의미이다.
반면에 아래와 같이 두 변수의 단위가 다르다면 v + a 는 불가능한 연산이다.
컴파일러 입장에서는 단위를 고려하지 않기 때문에, 에러가 발생하지는 않는다.
하지만, 실제로 동작하게 되면 골치아픈 문제가 발생한다. (NASA 의 경우 단위를 잘못 계산해 1조원까지 화성 탐사선을 날려먹었다..)
이 상황에서 가장 이상적인 방법은 단위가 맞지 않는 연산을 수행하는 코드가 있다면, 컴파일 에러를 발생시키는 것이다.
이를 위해서 다음과 같은 클래스를 생성해보자.
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