이 글은 <A Tour of C++ Second Edition, Bjarne Stroustrup>를 참고하여 작성하였습니다.
[A Tour of C++] Chapter 7. Concepts and Generic Programming
7.1 Introduction
C++에서 템플릿의 가장 큰 사용 목적은 제네릭 프로그래밍을 하기 위해서라고도 볼 수 있습니다. 템플릿을 사용하면 함수와 클래스가 나중에 지정되는 타입에 대해 작동할 수 있습니다. 이를 통해 1) 정보 손실 없이 다양한 타입을 처리할 수 있으며, 2) Constant value를 인자로 받기 때문에 런타임 오버헤드가 없다는 장점이 있습니다.
7.2 Concepts (C++20)
Concept은 템플릿 인자가 충족해야 하는 요구 사항을 정의하는 데 사용됩니다.
예를 들면, 아래의 예시에서 사용된 Concepts,
Sequence Seq 는 for 문을 적용 가능한 타입(vector, list, map 등)만 가능하다는 의미이며,
Number Num 는 덧셈이 가능한 타입(int, double 등) 만 가능하다는 의미입니다.
template<Sequence Seq, Number Num>
Num sum(Seq s, Num v)
{
for (const auto& x : s)
v += x;
return v;
}
혹은 requirements 절을 이용하여, 해당 타입에 대한 조건을 명시해줄 수 있습니다.
template<Sequence Seq, Number Num>
requires Arithmetic<Value_type<Seq>,Num>
Num sum(Seq s, Num v)
{
// ...
}
Concept 기반 Overloading
템플릿 함수는 컨셉에 기반하여 오버로딩할 수 있습니다. 컴파일 타임에 제공된 타입에 맞는 적절한 함수 구현이 선택됩니다. 두 개 이상의 Concept에 모두 해당한다면, 더 작은 범위의, 더 Specific한 Concept에 해당하는 함수를 선택합니다.
template<Forward_iterator Iter>
void move(Iter p, int n)
{
// ...
}
template<Random_access_iterator Iter>
void move(Iter p, int n)
{
// ...
}
Definitions of concepts
원하는 Concept이 없다면, 사용자가 컨셉을 직접 정의할 수도 있습니다.
template<typename T>
concept Equality_comparable =
requires (T a, T b) {
{ a == b } -> bool; // a와 b는 == 연산자로 비교 가능
{ a != b } -> bool; // a와 b는 != 연산자로 비교 가능
};
Valid Code
Concept을 정의하지 않고 아래처럼 바로 제약 사항을 정의할 수도 있지만, 이와 같은 구현 방식은 너무 로우 레벨 구현이며 의도가 명확히 전달되지 않기때문에 사용을 권장하지 않는다고 합니다. 보다는 의미가 잘 드러나는 이미 정의된 컨셉을 사용하는 것이 가장 좋은 방법입니다. 최후의 수단으로 concept을 직접 정의하기를 권장드립니다.
template<Forward_iterator Iter, int n>
requires requires(Iter p, int i) { p[i]; p + i; }
void move(Iter p, int n)
{
// ...
}
7.4 Variadic Templates
임의의 타입, 임의의 개수의 인자를 입력받는 템플릿을 가변 템플릿(Variadic Template)이라고 합니다. 여러 타입의 인자를 아무렇게나 받을 수 있다는 장점이 있으나, 굉장히 사람의 실수를 유발하는 요소가 많기 때문에, 가변 템플릿은 사용하지 않는 것을 권장드립니다.
template<typename T, typename ... Tail>
void print(T head, Tail... tail)
{
// ...
}
'개발 이야기 > [스터디] c++' 카테고리의 다른 글
[A Tour of C++] Chapter 11. Containers (0) | 2024.08.26 |
---|---|
[A Tour of C++] Chapter 8. Library Overview (0) | 2024.08.26 |
[A Tour of C++] Chapter 5. Essential Operations (0) | 2024.08.26 |
[A Tour of C++] Chapter 4. Classes (1) | 2024.08.26 |
[A Tour of C++] Chapter 3. Modularity (0) | 2024.08.23 |