ν νλ¦Ώ ꡬ체ν
-μμμ ꡬ체ν
μ¬μ©νκΈ° μνλ λ°μ΄ν°νμ λνλ΄λ νλ λλ κ·Έ μ΄μμ κ°μ²΄λ₯Ό μ μΈνλ©΄ μ»΄νμΌλ¬λ ν¬κ΄μ μΈ ν νλ¦Ώμ΄ μ 곡νλ μ€κ³λλ₯Ό μ¬μ©νμ¬ νλμ νΉμνλ ν΄λμ€ μ μλ₯Ό μμ±νλ€.
ArrayTP<int,100> stuff; //μμμ ꡬ체ν
-λͺ μμ ꡬ체ν
ν€μλ templateμ μ¬μ©νμ¬ ν΄λμ€λ₯Ό μ μΈνκ³ , μ¬μ©νλ €λ λ°μ΄ν°νμ λνλμ λ, μ»΄νμΌλ¬λ λͺ μμ ꡬ체νλ₯Ό μμ±νλ€.
template class ArrayTP<string,100>;
ArrayTP<string,100>μ΄ ν΄λμ€λΌκ³ μ μΈνλ€.
μ΄ μ μΈμ ν νλ¦Ώ μ μμ λμΌν μ΄λ¦ κ³΅κ° μμ μμ΄μΌ νλ€.
-λͺ μμ νΉμν
λͺ μμ νΉμνλ ν¬κ΄μ μΈ ν νλ¦Ώ λμ μ, μ¬μ©νλ €λ νΉμ ν λ°μ΄ν°νμ μν μ μμ΄λ€. ν¬κ΄μ μΈ λ°μ΄ν°ν λμ ꡬ체μ μΈ νλμ λ°μ΄ν°νμ λ§κ² μ μλ ν νλ¦Ώ νμμ μ·¨νλ€.
template<>class Classname<specialized-type-name>{...};
-λΆλΆμ μΈ νΉμν
λΆλΆμ μΈ νΉμνλ ν νλ¦Ώμ ν¬κ΄μ±μ μΌλΆ μ ννλ€.
μλ₯Ό λ€μ΄, λΆλΆμ μΈ νΉμνλ λ°μ΄ν°ν 맀κ°λ³μλ€ μ€μ μ΄λ νλμ ꡬ체μ μΈ λ°μ΄ν°νμ μ 곡ν μ μλ€.
//ν¬κ΄μ μΈ ν νλ¦Ώ
template<class T1,class T2> class Pair{...};
//T2λ₯Ό intλ‘ μ€μ ν, λΆλΆμ μΈ νΉμν
template<class T1>class Pair<T1,int> {...};
λ°μ΄ν°νμ λͺ¨λ μ§μ νλ©΄, κ΄νΈ μμ λΉκ² λκ³ μμ ν λͺ μμ νΉμνκ° μ΄λ£¨μ΄μ§λ€.
//T1κ³Ό T2λ₯Ό λͺ¨λ intλ‘ μ€μ ν, μμ ν λͺ μμ νΉμν
template<>class PAir<int,int>{...};
μ¬λ¬ κ°μ§ μ€μμ νλλ₯Ό μ νν΄μΌ νλ€λ©΄, μ»΄νμΌλ¬λ κ°μ₯ νΉμνλ ν νλ¦Ώμ μ¬μ©νλ€.
ν¬μΈν°λ€μ μν λ²μ μ μ 곡ν¨μΌλ‘μ¨, κΈ°μ‘΄μ ν νλ¦Ώμ λΆλΆμ μΌλ‘ νΉμνμν¬ μ μλ€.
template<class T> //ν¬κ΄μ μΈ λ²μ
class Feeb{...};
template<class T*> //ν¬μΈν°λ₯Ό μν λΆλΆμ μΈ νΉμν
class Feeb{...}; //μμ λ μ½λ
Feeb<char *>fb2; //T νΉμν μ¬μ©, Tλ char
λ©€λ² ν νλ¦Ώ
ν νλ¦Ώμ ꡬ쑰체, ν΄λμ€, ν νλ¦Ώ ν΄λμ€μ λ©€λ²κ° λ μ μλ€.
맀κ°λ³μ ν νλ¦Ώ
ν νλ¦Ώ 맀κ°λ³μλ, νμ€ ν νλ¦Ώ λΌμ΄λΈλ¬λ¦¬λ₯Ό ꡬννκΈ° μν΄ μ¬μ©λ ν νλ¦Ώ κΈ°λ₯μ΄λ€.
template<template<typename T>class Thing>
class Crab
ν νλ¦Ώ 맀κ°λ³μλ template<typename T>class Thingμ΄λ€.
μ¬κΈ°μ template<typename T> classκ° λ°μ΄ν°νμ΄κ³ , Thingμ΄ λ§€κ°λ³μμ΄λ€.
Crab<King> legs;
μ΄κ²μ΄ νμ©λλ €λ©΄ ν νλ¦Ώ 맀κ°λ³μ Kingμ΄ ν νλ¦Ώ ν΄λμ€μ¬μΌ νλ€. κ·Έλ¦¬κ³ ν νλ¦Ώ ν΄λμ€μ μ μΈμ΄ ν νλ¦Ώ 맀κ°λ³μ Thingμ μ μΈκ³Ό μΌμΉν΄μΌ νλ€.
template<typename T>
class King{...};
ν νλ¦Ώ 맀κ°λ³μλ₯Ό μΌλ° 맀κ°λ³μμ νΌν©νμ¬ μ¬μ©ν μ μλ€.
ν νλ¦Ώ ν΄λμ€μ νλ λ ν¨μ
ν νλ¦Ώμ νλ λλ₯Ό λ€μ 3κ°μ§λ‘ λΆλ₯ν μ μλ€.
ν νλ¦Ώμ΄ μλ νλ λ
λ°μ΄λ ν νλ¦Ώ νλ λ, ν΄λμ€κ° ꡬ체νλ λ ν΄λμ€μ λ°μ΄ν°νμ μν΄ νλ λμ λ°μ΄ν°νμ΄ κ²°μ λλ€.
μΈλ°μ΄λ ν νλ¦Ώ νλ λ, νλ λμ λͺ¨λ νΉμνκ° κ·Έ ν΄λμ€μ κ° νΉμνμ λν΄ νλ λλ€μ΄λ€.
-ν νλ¦Ώ ν΄λμ€μ λν ν νλ¦Ώμ΄ μλ νλ λ ν¨μ
ν νλ¦Ώ ν΄λμ€μ μλ 보ν΅μ ν¨μλ₯Ό νλ λλ‘ μ μΈν΄λ³΄μ
template<class T>
class HasFriend
{
friend void counts();//λͺ¨λ HasFriend ꡬ체νλ€μ λν΄ νλ λμ΄λ€.
...
};
μ΄ μ μΈμ counts() ν¨μλ₯Ό κ·Έ ν νλ¦Ώμ΄ κ°λ₯ν λͺ¨λ ꡬ체νλ€μ λν΄ νλ λλ‘ λ§λ λ€.
count() ν¨μλ κ°μ²΄ 맀κ°λ³μλ€μ κ°μ§μ§ μκ³ κ°μ²΄μ μν΄ νΈμΆλμ§ μλλ€. counts() ν¨μκ° HasFriend κ°μ²΄μ μ κ·Όνλ λ² 1. μ μ κ°μ²΄μ μ κ·Όν μ μλ€. 2. μ μ ν¬μΈν°λ₯Ό μ¬μ©νμ¬ μ μμ΄ μλ κ°μ²΄μ μ κ·Όν μ μλ€. 3. ν νλ¦Ώ ν΄λμ€μ static λ°μ΄ν° λ©€λ²μ μ κ·Όν μ μλ€. κ·Έλ¦¬κ³ κ·Έλ¬ν static λ°μ΄ν° λ©€λ²λ€μ κ°μ²΄μ λ°λ‘ λΆλ¦¬λμ΄ μ‘΄μ¬νλ€.
ν νλ¦Ώ ν΄λμ€ λ§€κ°λ³μλ₯Ό μ 곡νλ €λ©΄, νλμ νΉμνλ₯Ό μ 곡ν΄μΌ νλ€.
friend void report(HasFriend<T> &);
//HasFriend &λ μλ¨.
ν νλ¦Ώ ν΄λμ€μ λν λ°μ΄λ ν νλ¦Ώ νλ λ ν¨μ
1. ν΄λμ€ μ μ μμ ν νλ¦Ώ ν¨μ κ°κ° μ μΈ
template<typename T> void counts();
template<typename T> void report(T &);
2. ν¨μ μμμ λ€μ ν νλ¦Ώλ€μ νλ λλ‘ μ μΈ.
ν΄λμ€ ν νλ¦Ώ 맀κ°λ³μμ λ°μ΄ν°νμ κΈ°μ΄νλ νΉμνλ€ μ μΈ
template <typename T>
class HasFriendT
{
...
friend void counts<TT>();
friend void report<>(HasFriendT<TT>&);
//report<> = report<HasFriendT<TT>>
};
3. νλ‘κ·Έλ¨μ κ·Έ νλ λλ€μ μν μ μλ₯Ό μ 곡ν΄μΌ νλ€.
-ν νλ¦Ώ ν΄λμ€μ λν μΈλ°μ΄λ ν νλ¦Ώ νλ λ ν¨μ
ν νλ¦Ώμ ν΄λμ€ μμ μ μΈν¨μΌλ‘μ¨, μΈλ°μ΄λ νλ λ ν¨μλ₯Ό μμ±ν μ μλ€. μ΄λ λͺ¨λ ν¨μ νΉμνλ λͺ¨λ ν΄λμ€ νΉμνμ λν΄ νλ λμ΄λ€. μΈλ°μ΄λ νλ λλ€μ κ²½μ°, νλ λ ν νλ¦Ώ λ°μ΄ν°ν 맀κ°λ³μλ€μ ν νλ¦Ώ ν΄λμ€ λ°μ΄ν°ν 맀κ°λ³μλ€κ³Ό λ€λ₯΄λ€.
template<typename T>
class ManyFriend
{
...
template<typename C,typename D>friend void
Show2(C &,D &);
};
Show2(hf1i1,hfi2) ν¨μ νΈμΆμ λ€μκ³Ό κ°μ νΉμνμ μΌμΉνλ€.
void show2<ManyFriend<int> &,c,ManyFriend<int>& d);
ManyFriendμ λͺ¨λ νΉμνλ€μ λν΄ νλ λμ΄κΈ° λλ¬Έμ, μ΄ ν¨μλ λͺ¨λ νΉμνλ€μ item λ©€λ²μ μ κ·Όν μ μλ€. κ·Έλ¬λ ManyFriend<int> κ°μ²΄λ€μ λν μ κ·Όλ§μ μ¬μ©νλ€.