[[[정의]]]
템플릿을 사용하여 컴파일 타임에 코드를 생성하고 변형하여 프로그램을 조작하는 기술
이런식으로 정의를 외우면 금방 까먹을테고, 다음과 같이 기억하자
컴파일 시점에는 작성된 코드를 가지고서 exe파일을 만들고, 런타임 때 코드를 실행하는데
메타프로그래밍 기술을 사용하면 컴파일 시점에서 코드를 비교 생성 조작 결정 등등 할 수 있다.
컴파일 타임: 소스코드를 읽고 구문 분석하고 타입과 구조를 파악하고 코드를 생성한다.
if문이 있으면 결과가 true든 false든 관심 없고 소스코드 전체를 검사한다.
컴파일 타임에서 템플릿으로 작성된 함수를 어떻게 생성할까
예를들어 내가 template<class T> void function(T v1, T v2)라는 템플릿 함수를 만들었다고 하자.
main함수에 vector v, list l를 만들고 function(v.begin,v.end), function(l.begin(), l.end()) 이렇게 함수를 호출했다고 하자.
그러면 놀랍게도 컴파일 시점에서 코드를 두개로 분기시켜서 생성한다.
각각의 vector와 list에 맞게 함수가 각각 생기는 거다. 2개가 생기겠지.
알기 쉬운 용어를 사용하자면 "오버로딩" 된다.
런타임: 생성된 코드를 동작시킨다.
if문은 결과가 true, false에 따라서 분기하여 실행된다.
선택적 컴파일 if constexpr: 이것도 메타 프로그래밍으로 간주하고 있다.
1.is_same_v 함수 템플릿은 컴파일 시점에서 두 개의 타입을 비교해서 true, false를 리턴해 준다.
원래는 컴파일 때 이러한 비교를 할 수 없다. 런타임 시에만 가능하다. 근데 is_same_v는 되게 한다.
2.위에서 한 대로 컴파일 타임에서 조건 비교를 해서 true false를 얻었다고 하자.
하지만 컴파일 타임에는 if가 true든 false든 return e - b를 검사한다.
이 때 if constexpr을 사용하면 true일 때만 if문 코드를 생성하고 false일 때는 생성하지 않는다.
생성하지 않으니 return e - b에 대해 유효성 검사도 하지 않는 것이다.
조건 비교를 해서 true, false를 리턴 후 constexpr이 없으면 무용지물이다.
3. 선택적 컴파일은 조건에 맞으면 선택적으로 조건을 만족시킨 조건문을 컴파일 해주고
조건에 맞지 않아서 false를 리턴하면 else문을 컴파일 해주는 것이다.
컴파일 시점에서 조건에 따라 조건에 맞는 코드를 컴파일 해 준다.
원래 이게 하나의 코드다.
벡터는 if문이 선택적으로 컴파일 된다.
list는 else문이 컴파일 된다.
4. 정리하자면 컴파일이 완료되고 나면 템플릿 함수가 템플릿 매개변수 타입에 맞게 여러개 생성되 있을 것이다.
생성된 여러개의 함수에는 실행될 수 있는 코드가 있을텐데 그 코드를 컴파일 시점에서 바꿔 버렸다.
정확히는 매개 변수에 맞춰서 바꿔버렸다.
vector class type이 매개변수로 들어온 템플릿 함수는 if문 코드만 선택되어 컴파일 되었을 것이고
list class type이 매개 변수로 들어온 템플릿 함수는 else문 코드만 선택되어 컴파일 되었을 것이다.
이렇게 컴파일 타임에서 코드를 필요에 따라 변경 및 결정하고 컴파일을 한다.
템플릿 메타프로그래밍: 템플릿을 사용하여 컴파일 타임에 코드를 생성하고 결정한다.
is_same_v도 템플릿 메타프로그래밍의 일환으로 컴파일 타임에 두 개의 타입이 동일한 여부를 확인할 수 있다.
원래 컴파일 타임에는 이런 조건 비교같은거 못한다.
근데 할 수 있도록 해주는게 템플릿 메타프로그래밍이다.
'---C++ 역량 강화--- > STL 공부' 카테고리의 다른 글
사용자 정의 리터럴 접미사 (0) | 2024.06.06 |
---|---|
[c++20] concept (0) | 2024.06.06 |
distance (0) | 2024.06.04 |
copy (0) | 2024.06.04 |
stable_sort (0) | 2024.06.04 |