C++/템플릿(Template) 3

C++ 템플릿(Template): SFINAE

C++ Template: SFINAE Substitution Failure Is Not An Error SFINAE는 C++ 템플릿 프로그래밍에서 자주 쓰이는 기법입니다. 컴파일러가 알맞은 함수를 추론(deduce) 하는 원리를 이용해, 받는 타입을 제한하거나 타입에 따라 행동을 다르게 할 때 주로 사용하게 됩니다. SFINAE is a technique that is often used in C++ Template Programming. It restrains function parameter types by using the mechanism of how the compiler deduces appropriate overloaded functions and calling the appropriate ..

C++ 템플릿(Template): CRTP

항상 느끼는 것 이지만, C 나 C++ 개발자들은 정말 성능 변태가 분명합니다. 특히 템플릿을 배우기 시작하는 분들은 느끼시겠지만, 정말 성능 하나만을 위해 변태같은 짓을 하는것을 서슴치 않는 사람들이 바로 C++ 개발자들 입니다. 이번에 소개해드릴 템플릿 패턴은 CRTP 입니다. CRTP 는 동적 다형성(polymorphism), 즉 기반 클래스 포인터에 파생 클래스 객체의 포인터를 대입해 사용하는 것을 피하면서 가상(virtual) 함수의 override 를 흉내내는 템플릿 기법입니다. CRTP 는 템플릿에 의한 정적 다형성 이므로, 가상함수의 호출에 드는 오버헤드 비용을 없엘 수 있습니다. CRTP 의 약자는 Curiously Recursing Template Pattern 으로, 굳이 의역한다면 ..

C++ 템플릿(Template): 꼬리표 분배(Tag Dispatching) 기법

SFINAE 기법을 사용하면, 새로운 분기가 추가되면 기존 함수들의 템플릿 명세를 수정해야 합니다. 꼬리표 분배 방법은 템플릿 명세로 구분하는 것을, 함수의 인자로 구분하여 사용하는 방법입니다. 기존 함수들의 수정이 필요 없고, 깔끔해 지는 대신 표면에 드러난 함수와 처리하는 함수가 나눠지게 됩니다. 드러난 함수는 타입에 따라 알맞은 꼬리표를 실제 처리하는 함수에 전달해 주고, 처리하는 함수는 꼬리표에 따라 오버로딩해서 사용하는 방법입니다. 전달하는 방식은 템플릿 특수화(template specialization) 혹은 객체 넘겨 주기가 있습니다. 다만 특수화 해야 할 타입이 많고, 기능이 겹친다면 객체에 의한 꼬리표 분배 방식이 더 선호됩니다. 전자를 tag dispatching by type, 후자를..