Template
Basic
template <class T>
는 template <typename T>
와 같지만 되도록 typename
권장
template <typename T>
class Vector {
T* data;
int capacity, length;
public:
Vector(int n = 256) : data(new T[n]), capacity(n), length(0) { }
~Vector() {
if (data) delete[] data;
}
void push_back(T s) {
if (capacity <= length) {
T* temp = new T[capacity * 2];
for (int i = 0; i < length; i++) {
temp[i] = data[i];
}
delete[] data;
data = temp;
capacity *= 2;
}
data[length++] = s;
}
T operator[](int index) { return data[index]; }
void remove(int index) {
for (int i = index + 1; i < length; i++) {
data[i - 1] = data[i];
}
length--;
}
const int size() { return length; }
}
Function Object, or Functor
operator ()
를 오버라이딩해서 함수인 것처럼 동작하게 한다.
struct Less {
bool operator()(int x, int y) { return x < y; }
}
Variadic Template
typename
뒤 에 붙는 ...
을 템플릿 파라미터 팩 이라고 한다. 0 개 이상의 인자를
뜻한다.
- 함수 인자 앞 에 붙는
...
을 함수 파라미터 팩 이라고 하고 역시 0 개 이상의 인자를
뜻한다.
- 재귀함수라고 생각하면 된다. 따라서 함수 인자가 하나만 있을 때 동작할 베이스
케이스도 작성해줘야 한다. 이때 주의할 점은 가변인자 함수보다 베이스 케이스
함수가 더 먼저 정의되어야 한다.
size_t GetStringSize(const char* s) { return strlen(s); }
size_t GetStringSize(const std::string& s) { return s.size(); }
template <typename String, typename...Strings>
size_t GetStringSize(const String& s, Strings... strs) {
return GetStringSize(s) + GetStringSize(strs...);
}
void AppendToString(std::string* str) { }
template <typename String, typename... Strings>
void AppendToString(std::string* str, const String& s, Strings... strs) {
str->append(s);
AppendToString(str, strs...);
}
template <typename String, typename... Strings>
std::string StrCat(const String& s, Strings... strs) {
// calcuate the length of the concatenated string
size_t totalSize = GetStringSize(s, strs...);
// allocate space in advance
std::string res;
res.reverse(totalSize);
res = s; // initial string
AppendToString(&res, strs...);
return res;
}
Fold Expression
- C++17에서 도입된 기능(?). 걍 OCaml 폴드다..
문법 | 이름 | 풀리는 형태
|
(E op ...) | Unary Fold Right | (E1 op (... op (EN-1 op EN)))
|
(... op E) | Unary Fold Left | (((E1 op E2) op ...) op EN)
|
(E op ... op I) | Binary Fold Right | (E1 op (... op (EN-1 op (EN op I))))
|
(I op ... op E) | Binary Fold Left | ((((I op E1) op E2) op ...) op EN)
|
Last Update: 2023-03-10 05:09:44 PM