Templates(ν νλ¦Ώ)
- μ»΄νμΌλ¬λ₯Ό μν ν¨ν΄μ μ’ λ₯
- μλ‘ λ€λ₯Έ νμ μ΄λ κ°μΌλ‘ ν νλ¦Ώμ μΈμ€ν΄μ€ν ν μ μμ
- ν νλ¦Ώμ νλ‘κ·Έλλ¨Έμ μμ μ μ€μ¬μ£Όλ©°, μ½κ° λ€λ₯Έ νμ λλ¬Έμ μ¬λ¬ λ² ν¨μλ₯Ό ꡬννμ§ μμλ λ¨
- ν νλ¦Ώμ νμ ν€μλ template μΌλ‘ μμλ¨
μμ )

cout << min(i1, i2) << endl; μμ μ»΄νμΌλ¬λ intλ‘ minν¨μλ₯Ό μμ±νκ³ ,
cout << min<float> (f1, f2) << endl; μμ μ»΄νμΌλ¬λ floatλ‘ minν¨μλ₯Ό μμ±νλ€
μ΄μ²λΌ μ¬λ¬ λ² ν¨μλ₯Ό ꡬννμ§ μκ³ λ λ€λ₯Έ νμ μ μΈμνκ² ν΄μ£Όλ κ²μ΄ ν νλ¦Ώμ μ₯μ μ΄λ€.
μΈμ€ν΄μ€νλ?
- ν νλ¦Ώμ μ¬μ©νλ©΄ μΈμ€ν΄μ€(κ°μ²΄)ν λλλ°, μ΄λ μ»΄νμΌλ¬κ° ν νλ¦Ώμ ꡬ체μ μΈ μΈμλ‘ λ체νκΈ° λλ¬Έ
- μ»΄νμΌλ¬λ ν¨μλ‘ λκ²¨μ§ μΈμκ°μ μ΄μ©ν΄ ν νλ¦Ώμ μλμΌλ‘ μΈμ€ν΄μ€ν νλ€
- μ»΄νμΌλ¬κ° μΈμλ₯Ό κ²°μ νμ§ λͺ»νλ©΄ λͺ μμ μΌλ‘ κΈ°μ ν΄μΌ νλ€

Specializations
ν νλ¦Ώ κ°μ²΄μ νΉμ ν κ²½μ°μ μ μ°μ±μ΄λ μ€ν νλμ μ€μν ν΄λ‘μ μμ©νκΈ° μν΄
λ€μκ³Ό κ°μ΄ ν νλ¦Ώμ Specializationsνκ² μ¬μ©ν μλ μλ€.
template <>
bool equal (const double& a, const double& b) {
ββββreturn std::abs(a-b) < 0.00001;
}
μ¬μ©ν λλ, λ€μκ³Ό κ°μ΄ general versionμ λ¨Όμ μ μνκ³ νΉμ κ²½μ°μ ν νλ¦Ώμ μ μν΄μΌ νλ€
// general versionμ λ¨Όμ μ μνλ€
template <class T> void sort(List<T>& v) {
...
}
// specializationsλ₯Ό λ€μμ μ μνλ€
template <> void sort(List<char *>& v) {
...
}
Templates(ν νλ¦Ώ)μ Parameter(νλΌλ―Έν°)


<ν νλ¦Ώμ μ’ λ₯>
1. ν¨μ ν νλ¦Ώ(Function Template)
2. ν΄λμ€ ν νλ¦Ώ(Class Template) : 컨ν μ΄λ ν΄λμ€(List, Array, Set, Queue, Stack ...)μμ λ§μ΄ μ¬μ©
3. κ°λ³ κΈΈμ΄ ν νλ¦Ώ(Variadic Template) : parameter pack
4. λ³μ ν νλ¦Ώ
ν¨μ ν νλ¦Ώ (Function Template)
- μλ‘ λ€λ₯Έ νμ μ λν΄ ν΅μΌλ κΈ°λ₯μ ꡬνν μ μμ
- ν νλ¦Ώ νλΌλ―Έν°λ νμ (types)μ΄λ κ°(values)
- νμ μ typenameμ΄λ classλ‘ μμν¨
- ν νλ¦Ώ νλΌλ―Έν°μ μ΄λ¦μ typename λ€μ μ΄
- μ΄λ¦μ 첫 λ²μ§Έ νλΌλ―Έν°λ λ³΄ν΅ Tλ‘ λ λ²μ§Έ νλΌλ―Έν°λ Uλ₯Ό μ ex) template <typename T=int, typename U=double>
- ν¨μ μμμ μ΄ μ΄λ¦μ νΉμ νμ λμ μ μ¬μ©ν¨
#include <iostream>
template <typename T>
T min(const T& a, const T& b) {
ββββreturn (a < b) ? a : b
}
int main(){
ββββconst int a = 2;
ββββconst int b = 1;
ββββstd::cout << min(a, b) << std::endl;
}
#include <vector>
using namespace std;
template <typename T>
const T* find(const vector<t>& data, const T& v) {
ββββfor (auto i = 0; i < data.size(); i++)
βββββif(data[i] == y)
βββββββββreturn &data[i];
ββββreturn nullptr;
}
int main() {
ββββvector <int> v;
ββββ//insert some elements
ββββconst int *found = find(v, 7);
ββββif (found != nullptr)
ββββ...
}
ν΄λμ€ ν νλ¦Ώ (Class Template)
- ν¨μ ν νλ¦Ώκ³Ό λ§μ°¬κ°μ§λ‘ ν€μλ templateμΌλ‘ μμν¨
- ν¨μ ν νλ¦Ώμ λλΆλΆ κ·μΉμ΄ ν΄λμ€ ν νλ¦Ώμλ μ μ©λ¨
- λ©€λ² ν¨μλ ν΄λμ€μ λ΄λΆλ λ°μμ ꡬν κ°λ₯ν¨
- ν΄λμ€ λ°μμ ꡬνν λλ template-headκ° νμν¨
C++ 17λΆν° ν΄λμ€ ν νλ¦Ώμ μΈμλ₯Ό μλμΌλ‘ μΆλ‘ ν μ μμ *** (μλ μΈμ€ν΄μ€νκ° λΆκ°λ₯νλ€)
κ·Έλ¬λ―λ‘ κ°λ³ ν νλ¦Ώ μΈμλ€μ λͺ μμ μΌλ‘ κΈ°μ λμ΄μΌ νλ€
#include <iostream>
#include <vector>
using namespace std;
int main(){
ββββvector vec = {1, 2, 3};
ββββfor (const auto& i : vec)
βββββcout << i << " ";
}
Method Templates
ν΄λμ€ ν νλ¦Ώμ λ©μλλ μμ λ§μ ν νλ¦Ώμ κ°μ§ μ μμ
- λ©μλ ν νλ¦Ώμ ν΄λμ€μ λ΄λΆλ λ°μ μ μλ μ μμ
- λ³΅μ¬ μμ±μμ μλ©Έμλ ν νλ¦Ώμ΄ λ μ μμ
#include <iostream>
template <typename T> // T 첫 λ²μ§Έ νλΌλ―Έν°
class Foo {
public:
ββββFoo(const T& x) : mX{x} {}
ββββ
ββββtemplate<typename U> // U λ λ²μ§Έ νλΌλ―Έν°
ββββFoo<T>& operator=(const U& u){
βββββmX = static_cast<T>(u);
ββββββββreturn *this;
ββββ}
private:
ββββT mX;
};
κ°λ³ κΈΈμ΄ ν νλ¦Ώ(Variadic Template)
1. typenema... Ts : optional nameμ κ°μ§ ν νλ¦Ώ νλΌλ―Έν° ν©. νμ μ μμ±
2. Args... ts : optional nameμ κ°μ§ ν¨μ μΈμ νλΌλ―Έν° ν©
3. sizeof...(ts) : μ λ¬λ°μ μΈμμ κ°μλ₯Ό κ²°μ
4. ts... : ν¨μ λ΄λΆμμ μΈμλ€μ μΈν©(unpack)ν¨. tsλ₯Ό μΈμλ‘ λ°μμ μ½€λ§(,)λ‘ κ΅¬λΆ
