템플릿 메타프로그래밍은 기존 작업을 런타임에서 컴파일 타임으로 전환하는 효과를 낸다. 따라서 TMP를 쓰면 선행 에러 탐지와 높은 런타임 효율을 낼 수 있다. TMP는 정책 선택의 조합에 기반하여 사용자 정의 코드를 생성하는 데 쓸 수 있으며, 특정 타입에 대해 부적절한 코드가 만들어지는 것을 막는 데도 쓸 수 있다. 템플릿 메타프로그래밍 템플릿 메타프로그래밍(template metaprogramming: TMP)은 컴파일 도중에 실행되는 템플릿 기반의 프로그래밍을 말한다. 템플릿 메타프로그램은 C++ 컴파일러가 실행시키는, C++로 만들어진 프로그램이다. TMP프로그램이 실행을 마친 후엔 그 결과로 나온 출력물이 다시 보통의 컴파일 과정을 거친다. C++은 템플릿 메타프로그래밍을 염두에 두고 설계되지는..
템플릿
모든 매개변수에 대해 암시적 타입 변환을 지원하는 템플릿과 관계가 있는 함수를 제공하는 클래스 템플릿을 만들려고 한다면, 이런 함수는 클래스 템플릿 안에 프렌드 함수로서 정의해라. 비멤버 함수를 클래스 템플릿 안에 모든 매개변수에 대해 암시적 타입 변환이 되도록 만들기 위해서는 비멤버 함수로 만들어야 한다. Rational 클래스와 operator*함수를 템플릿으로 만들 것이다. template class Rational { public: Rational(const T& numerator = 0, const T& denominator = 1); const T numerator() const; const T denominator() const; ... }; template const Rational ope..
파생 클래스 템플릿에서 기본 클래스의 이름을 참조할 때는, this-> 를 접두사로 붙이거나 기본 클래스 한정문을 명시적으로 써 주면 된다. 템플릿으로 만들어지는 기본 클래스의 이름에 접근하는 법 메시지 전송 응용프로그램을 만든다고 가정해 보자. 전송용 메시지는 암호화될 수도 있고 비가공텍스트 형태일 수 있다. 만약 어떤 메시지가 어디로 전송될지를 컴파일 도중에 결정할 수 있는 충분한 정보가 있다면, 템플릿 기반의 방법을 쓸 수 있다. class CompanyA { public: ... void sendCleartext(const std::string& msg); void sendEncrypted(const std::string& msg); ... }; class CompanyB { public: .....
클래스 및 템플릿은 모두 인터페이스와 다형성을 지원한다. 클래스의 경우, 인터페이스는 명시적이며 함수의 시그니처를 중심으로 구성되어 있다. 다형성은 프로그래밍 실행 중에 가상 함수를 통해 나타난다. 템플릿 매개변수의 경우, 인터페이스는 암시적이며 유효 표현식에 기반을 두어 구성된다. 다형성은 컴파일 중에 템플릿 인스턴스화와 함수 오버로딩 모호성 해결을 통해 나타난다. 템플릿 프로그래밍의 암시적 인터페이스 & 컴파일 타임 다형성 객체 지향 프로그래밍에서 명시적 인터페이스와 런타임 다형성은 매우 중요하다. class Widget { public: Widget(); virtual ~Widget(); virtual std::size_t size() const; virtual void normalize(); vo..