Template
templateμ νλμ ν¨μ νΉμ classκ° μλ‘ λ€λ₯Έ μλ£νμ λν΄ λμν μ μλλ‘ ν΄ μ€λλ€.
#include <iostream>
template <typename T1,class T2>
int Add(T1 t1,T2 t2)
{
std::cout << typeid(t1).name() << std::endl;
std::cout << typeid(t2).name() << std::endl;
return t1 + t2;
}
int main(int argc, const char * argv[])
{
std::cout << Add<int,int>(1,2) << std::endl;
std::cout << Add(1,2.1) << std::endl;
//std::cout << Add("T1","T2") << std::endl; // compile error
return 0;
}
i
i
3
i
d
3
μ μΈ λ¬Έλ²μ template<typename 'νμ
',typename 'νμ
', ...> μ
λλ€.
νμνλ§νΌ <> μμ νμ
μ λμ΄νλ λ°©μμΌλ‘ μ¬μ©ν μ μμ΅λλ€.
μ¬κΈ°μμ typenameκ³Ό classλ κ°μ μλ―Έλ₯Ό κ°μ§λλ€.
μ¬μ©μμλ ν¨μ νΉμ ν΄λμ€μ <>λ₯Ό λΆμ΄κ³ μΉνν νμ
μ λμ΄νκ² λ©λλ€.
Add<int,int>μ κ²½μ°, μλμ κ°μ΄ μΉνλμ΄ μ»΄νμΌ λ©λλ€.
int Add(int t1,int t2)
{
std::cout << typeid(t1).name() << std::endl;
std::cout << typeid(t2).name() << std::endl;
return t1 + t2;
}
μ»΄νμΌλ¬κ° νμ
μ μ μΆν μ μλ κ²½μ°, μ¬μ©μμ νμ
λͺ
μλ μλ΅ν μ μμ΅λλ€.
μμ μμ std::cout << Add(1,2.1) << std::endl; μ½λμ ν΄λΉν©λλ€.
μ΄λ 첫λ²μ§Έλ intλ‘, λλ²μ§Έλ doubleμ΄ μ μΆλμμ΅λλ€.
templateμ μλ‘ λ€λ₯Έ μ½λμμ μ¬μ©νκΈ° μν΄μλ ν€λνμΌμ λͺ¨λ ꡬνμ κ°μΆκ³ μμ΄μΌ ν©λλ€.
μ΄λ μ»΄νμΌλ¬κ° μ€μ ν
νλ¦Ώ μ½λκ° μ¬μ©λλ ννλ₯Ό λ³΄κ³ μ λΉνκ² κ΅¬ν μ½λλ₯Ό μμ±νκΈ° λλ¬Έμ΄λ©°,
μλ μΌμ΄μ€λ μ»΄νμΌ ν μ μμ΅λλ€.
template <typename T1,class T2>
int Add(T1 t1,T2 t2);
λν, template μ½λ μμλ λ¬Έλ²λ§ λ§μΌλ©΄ μ΄λ ν μ½λλΌλ μμ±ν μ μμ§λ§
μ€μ μΉννμ¬ μ»΄νμΌμ ν λ λ¬Έμ κ° λ°μνλ©΄ μλ¬κ° λ°μνκ² λ©λλ€.
std::cout << Add("T1","T2") << std::endl; μ½λλ const char pointer μλ£νμΌλ‘ μ μΆλλλ°
const char pointer + const char pointer λ μ€μ λμνλ μ°μ°μ΄ μμΌλ―λ‘ μ»΄νμΌ μλ¬κ° λκ² λ©λλ€.
ν΄λμ€λ‘ ν΄λΉ ꡬνμ νλ² κ°μΌλ€λ©΄ μλμ κ°μ μ½λκ° λ κ²μ λλ€.
#include <iostream>
template <typename T1,class T2>
class Calculator
{
public:
static int Add(T1 t1,T2 t2)
{
std::cout << typeid(t1).name() << std::endl;
std::cout << typeid(t2).name() << std::endl;
return t1 + t2;
}
template <typename T3,class T4>
int Add2(T3 t1,T4 t2)
{
std::cout << typeid(t1).name() << std::endl;
std::cout << typeid(t2).name() << std::endl;
return t1 + t2;
}
};
int main(int argc, const char * argv[])
{
std::cout << Calculator<int,int>::Add(1,2) << std::endl;
//std::cout << Calculator::Add(1,2.1) << std::endl; // compile error
return 0;
}
template class μμλ λ¬Όλ‘ λ€λ₯Έ template methodκ° μμ±λλ κ²λ κ°λ₯ν©λλ€.
λ€λ§, classμ template μ μκ° μκΈ° λλ¬Έμ
functionμ μΈμλΆν° templateμ νμ
μ μΆλ₯Ό νμ§ λͺ» νλ μν©μ΄ μμ μμ μμ λ°μν©λλ€.
templateμ μλ£νμ λ
립μ μΈ μκ³ λ¦¬μ¦μ ꡬνν μ μλλ‘ ν΄ μ£Όλ κΈ°λ₯μ
λλ€.
C++μ νμ€ μ€μλ STL (standard template library)κ° μ‘΄μ¬νλ©°, μ¬λ¬ μκ³ λ¦¬μ¦λ€μ΄ 미리 ꡬνλμ΄ μμ΅λλ€.