constexpr
[C++] Class, Aliasing, Variable Template (여러 템플릿들)
이번 포스트에서 다룰 내용은 다양한 Template에 대해서 공부한다. 이제까지 배운 Template은 Temlate Function밖에 없었지만 이번에는 다양한 Template에 대한 사용법을 알아본다. 먼저 배울 Template은 아래와 같다.
- Class Template
- Aliasing Temlate
- Variable Template
Class Template (클래스 템플릿)
Class template은 우리가 알게 모르게 사용을 많이 한다. STL(Dtandard Template Library) 자체가 Template으로 구성된 라이브러리이다. Class Template도 Template Function과 동일하게 사용을 하면 된다. 필자는 Template에 대해서 공포감을 느끼기 때문에 충분히 이해가 가능하지만 거부감이 든다. 아래는 Template을 이용해서 push와 pop만 가능한 Data Sturcture의 Stack을 만든 예제이다.
이미 다 공부한 내용이라 코드 첨부로 설명을 마친다.
template<typename T>
class Stack
{
public:
void push(T elem)
{
mVec.emplace_back(std::move(elem));
}
bool pop(T& elem)
{
if (mVec.size() == 0)
return false;
elem = mVec[mVec.size() - 1];
mVec.pop_back();
return true;
}
private:
std::vector<T> mVec;
};
int main()
{
Stack<std::string> stack;
stack.push("jiyong");
stack.push("is");
stack.push("he");
std::string n;
while (stack.pop(n))
{
std::cout << n << '\n';
}
}
Aliasing Template (별명 템플릿?)
Alias는 별명 혹은 별칭이라는 뜻을 가지고 있다. 결국 Aliasing Template은 별명을 가지게 하는 게 Template을 이용해서 별명을 만든다고 생각하면 쉽다.
#include <vector>
#include <array>
template<typename T>
using pretendKeys = std::vector<std::array<T, 64>>;
int main()
{
/*
* alias
* using pretendInt = int;
* using pretendKeys = std::vector<int*_t, 64>;
*/
pretendKeys<float> floatKeys;
//std::vector<std::array<float, 64>> floatKeys
pretendKeys<double> doubleKeys;
//std::vector<std::array<double, 64>> doubleKeys
}
alias을 만드는 법은 using 키워드를 통해 만들 수 있다. C++03에서는 typedef를 사용했지만 C++11에서부터 using을 사용해서 더 직관적이게 "별명"을 붙일 수 있다.
Variable Template (변수 템플릿) C++14
먼저 Variable Template을 설명하기 전에 const와 constexpr에 대해서 짧게 설명한다.
int main()
{
int n = 10;
const int a = 10 + n;
constexpr int b = 11 + n; //ERROR 컴파일 타임에 n이 정해지지 않음.
return 0;
}
const와 constexpr 둘 다 상수를 선언하는 키워드이다. 둘의 차이점은 컴파일 상수이냐 런타임 상수이냐의 차이이다. const는 런타임에 초기값이 정해져 있어야 하고 constexpr는 컴파일 타임에 초기값이 정해져 있어야 한다는 차이점이다.
이제 Variable Template (변수 템플릿)에 대해서 공부를 하자.
변수 템플릿도 별거 없다. C++14부터 지원되는 기능이다. 아래 예제를 보고 충분히 이해할 수 있다.
#include <iostream>
template<typename T>
constexpr T number = T(123.123);
int main()
{
std::cout << number<int>;
return 0;
}
Variable Template으로 number라는 상수를 선언하고 123.123이라는 값으로 초기화를 하였다.
main함수에서 number상수에 Anlge Bracket으로 Type을 int로 명시하여 출력해주면 integer값으로 Casting이 되고 123이 출력이 된다.
Ref.
https://www.youtube.com/watch?v=87nJ-3U4LkA&list=PLDV-cCQnUlIb2oezNpNTmxiiX_NibMrlO&index=5
'Modern C++' 카테고리의 다른 글
[C++] STL std::vector (벡터) Intro. (0) | 2021.08.29 |
---|---|
[C++] C++20 찍먹 Concepts (0) | 2021.08.28 |
[C++] Template Instantiation (템블릿 인스턴스화) (0) | 2021.08.27 |
[C++] Template Type Deduction (템플릿 타입 추론) : Perfect Forwarding (0) | 2021.08.26 |
[C++] Template Intro. (템플릿) : Function Template (함수 템플릿) (0) | 2021.08.26 |