728x90
반응형
uisng 또는 typedef를 이용하여 유형에 대한 별칭을 정의할 수 있다. using 구문은 일부 인수가 바인딩된 템플릿의 별칭을 정의하는 데 사용할 수 있다는 중요한 의미에서 더 일반적이다.
template<typename T, typename Allocator = allocator<T>> vector;
using Cvec = vector<char>; // both arguments are bound
Cvec vc = {'a', 'b', 'c'}; // vc is a vector<char,allocator<char>>
template<typename T>
using Vec = vector<T,My_alloc<T>>; // vector using my allocator (2nd argument is bound)
Vec<int> fib = {0, 1, 1, 2, 3, 5, 8, 13}; // fib is a vector<int,My_alloc<int>>
일반적으로 템플릿의 모든 인수를 바인딩하면 유형을 얻지만 일부만 바이딩하면 템플릿을 얻는다. 별칭 정의에서 사용하여 얻는 것은 항상 별칭이다. 즉, alias를 사용하면 원래 템플릿을 사용하는 것과 완전히 동일하다.
vector<char,alloc<char>> vc2 = vc; // vc2 and vc are of the same type
vector<int,My_alloc<int>> verbose = fib; // verbose and fib are of the same type
별칭과 원래 템플릿이 동등하다는 것은 템플릿을 specialization하면 별칭을 사용할 때 specialization을 얻을 수 있음을 의미한다.
template<int>
struct int_exact_traits { // idea: int_exact_traits<N>::type is a type with exactly N bits
using type = int;
};
template<>
struct int_exact_traits<8> {
using type = char;
};
template<>
struct int_exact_traits<16> {
using type = short;
};
template<int N>
using int_exact = typename int_exact_traits<N>::type; // define alias for convenient notation
int_exact<8> a = 7; // int_exact<8> is an int with 8 bits
별칭을 통해 specialization이 사용되지 않았다면 int_exact가 단순히 in_exact_traits <N>::type의 별칭이라고 주장할 수 없다. 그들은 다르게 행동할 것이다. 반면에 별칭의 specialization를 정의할 수 없다.
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] unique_ptr<T> nullptr 비교하기 (0) | 2022.04.12 |
---|---|
[C++] Algorithms and Lifting (0) | 2022.02.18 |
[C++] Function Template (0) | 2022.02.17 |
[C++] Console 한 줄 Refresh (0) | 2022.02.16 |
[C++] Class Template (0) | 2022.02.10 |