Ŭ·¡½º ÅÛÇø´µµ ÇÔ¼ö ÅÛÇø´°ú ¸¶Âù°¡Áö·Î ½ÇÁ¦ Ŭ·¡½º ŸÀÔÀÌ »ç¿ëµÉ ¶§¸¸ ±¸Ã¼ÈµÈ´Ù. ¸¸¾à ƯÁ¤ ŸÀÔ¿¡ ´ëÇØ ¹Ì¸® Ŭ·¡½º ¼±¾ðÀ» ¸¸µé¾î ³õÀ» Çʿ䰡 ÀÖ´Ù¸é ¸í½ÃÀû ±¸Ã¼È¸¦ ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î float ŸÀÔÀÇ PosValue Ŭ·¡½º¸¦ ¹Ì¸® Á¤ÀÇÇØ µÎ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
template class PosValue<float>;
ÀÌ ¼±¾ð¿¡ ÀÇÇØ ÄÄÆÄÀÏ·¯´Â PosValue<float> Ŭ·¡½º¸¦ ¹Ì¸® »ý¼ºÇÑ´Ù. ¼³»ç ÀÌ·± ŸÀÔÀÇ °´Ã¼¸¦ ´çÀå ¼±¾ðÇÏÁö ¾Ê´Â´Ù ÇÏ´õ¶óµµ ÄÄÆÄÀÏ·¯´Â Ŭ·¡½º ¼±¾ð°ú Ŭ·¡½º ¼Ò¼ÓÀÇ ¸â¹ö ÇÔ¼öµéÀ» ¸ðµÎ ±¸Ã¼ÈÇØ µÑ °ÍÀÌ´Ù. ƯÁ¤ ŸÀÔ¿¡ ´ëÇÑ Å¬·¡½º¸¦ µû·Î »ý¼ºÇϴ Ư¼öȵµ ¹°·Ð Áö¿øµÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â tag_Friend ŸÀÔ¿¡ ´ëÇØ PosValue Ŭ·¡½º¸¦ Ư¼öÈÇÑ´Ù.
|
¿¹ Á¦ : SpecializationClass |
#include <Turboc.h>
#include <iostream>
using namespace std;
template <typename T>
class PosValue
{
private:
int x,y;
T value;
public:
PosValue(int ax, int ay, T av) : x(ax),y(ay),value(av) { }
void OutValue();
};
template <typename T>
void PosValue<T>::OutValue()
{
gotoxy(x,y);
cout << value << endl;
}
struct tag_Friend {
char Name[10];
int Age;
double Height;
};
template <> class PosValue<tag_Friend>
{
private:
int x,y;
tag_Friend value;
public:
PosValue(int ax, int ay, tag_Friend av) : x(ax),y(ay),value(av) { }
void OutValue();
};
void PosValue<tag_Friend>::OutValue()
{
gotoxy(x,y);
cout << "À̸§:" << value.Name << ", ³ªÀÌ:" << value.Age
<< ", Ű:" << value.Height << endl;
}
void main()
{
PosValue<int> iv(1,1,2);
tag_Friend F={"¾Æ¹«°³",25,177.7};
PosValue<tag_Friend> fv(2,2,F);
iv.OutValue();
fv.OutValue();
}
PosValue Ŭ·¡½º´Â À§Ä¡¸¦ °¡Áö´Â ÀÓÀÇ Å¸ÀÔÀÇ °ªÀ» Ç¥ÇöÇϴµ¥ ÀÓÀÇ Å¸ÀÔÀ̶ó°í ÇßÀ¸¹Ç·Î int, char, double µîÀÇ Ç¥ÁØ Å¸ÀÔÀº ¹°·ÐÀÌ°í ±¸Á¶Ã¼³ª Ŭ·¡½º ŸÀÔ¿¡ ´ëÇØ¼µµ µ¿ÀÛÇØ¾ß ÇÑ´Ù. ±×·¯³ª OutValue ¸â¹ö ÇÔ¼ö°¡ °ª Ãâ·ÂÀ» À§ÇØ cout Ç¥ÁØ Ãâ·Â °´Ã¼¸¦ »ç¿ëÇϱ⠶§¹®¿¡ »ç½Ç»ó coutÀÌ ÀνÄÇϴ ŸÀÔ¿¡ ´ëÇØ¼¸¸ Áö¿øÇÏ´Â ¼ÀÀÌ´Ù. tag_Friend ±¸Á¶Ã¼ ŸÀÔ¿¡ ´ëÇÑ PosValue Ŭ·¡½º¸¦ ÀÛ¼ºÇÏ·Á¸é ÀÌ Å¸ÀÔ¿¡ ´ëÇÑ Æ¯¼öÈµÈ ¹öÀüÀ» ¸¸µé°í OutValue ÇÔ¼öÀÇ Äڵ带 Á¶±Ý ´Ù¸£°Ô ÀÛ¼ºÇÒ Çʿ䰡 ÀÖ´Ù. Ư¼öȸ¦ ÇÒ ¶§´Â ´ÙÀ½ Çü½ÄÀ¸·Î Ŭ·¡½º¸¦ Á¤ÀÇÇÑ´Ù.
template<> class Ŭ·¡½º¸í<Ư¼öŸÀÔ>
ÀÌ·¸°Ô Á¤ÀÇÇϸé ÁöÁ¤ÇÑ Å¸ÀÔ¿¡ ´ëÇØ Ư¼öÈµÈ Å¬·¡½º¸¦ »ý¼ºÇÑ´Ù. ÀμöÀÇ Å¸ÀÔÀÌ ÀÌ¹Ì °áÁ¤µÇ¾î ÀÖÀ¸¹Ç·Î Ư¼öÈµÈ Å¬·¡½ºÀÇ ¸â¹ö ÇÔ¼ö¸¦ ¿ÜºÎ¿¡¼ Á¤ÀÇÇÒ ¶§´Â template < >¸¦ ºÙÀÌÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù. OutValue ÇÔ¼ö´Â tag_Friend ±¸Á¶Ã¼ÀÇ °¢ ¸â¹ö¸¦ ¼ø¼´ë·Î Ãâ·ÂÇϵµ·Ï ¼öÁ¤Çߴµ¥ ¿ø·¡ÀÇ PosValue ÅÛÇø´¿¡ ÀÖ´Â OutValue¿Í´Â Äڵ尡 ´Ù¸£´Ù. ½ÇÇàÇØ º¸¸é (2,2) À§Ä¡¿¡ ±¸Á¶Ã¼ FÀÇ ³»¿ëÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.
Ư¼öȸ¦ ÇÏ¸é Æ¯¼öÈµÈ Å¬·¡½º´Â °´Ã¼¸¦ ¼±¾ðÇÏÁö ¾Ê´õ¶óµµ ÀÚµ¿À¸·Î ±¸Ã¼ÈµÈ´Ù. Áï, Ŭ·¡½º Á¤Àǰ¡ ¸¸µé¾îÁö°í ¸â¹ö ÇÔ¼öµéÀº ÄÄÆÄÀÏµÇ¾î ½ÇÇà ÆÄÀÏ¿¡ Æ÷ÇԵȴÙ. µû¶ó¼ Ư¼öÈµÈ Å¬·¡½º¿¡ ´ëÇÑ Á¤ÀÇ´Â ÀϹÝÀûÀÎ ÅÛÇø´ Ŭ·¡½º¿Í´Â ´Þ¸® Çì´õ ÆÄÀÏ¿¡ ÀÛ¼ºÇؼ´Â ¾ÈµÇ¸ç ±¸Çö ÆÄÀÏ¿¡ ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¿¹Á¦¿¡¼´Â ±¸Á¶Ã¼¿¡ ´ëÇØ¼µµ PosValue ÅÛÇø´À» ¾²±â À§ÇØ Æ¯¼öȸ¦ »ç¿ëÇߴµ¥ »ç½Ç À̺¸´Ù ´õ °£´ÜÇÑ ¹æ¹ýÀº tag_Friend ±¸Á¶Ã¼°¡ << ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇØ¼ ±âÁ¸ ÅÛÇø´ÀÇ º»Ã¼ Äڵ带 Áö¿øÇÏ´Â °ÍÀÌ´Ù.
ºÎºÐ Ư¼öÈ(Partial Specialization)¶õ ÅÛÇø´ Àμö°¡ ¿©·¯ °³ ÀÖÀ» ¶§ ±× Áß Çϳª¿¡ ´ëÇØ¼¸¸ Ư¼öȸ¦ ÇÏ´Â ±â¹ýÀÌ´Ù. ´ÙÀ½ ÅÛÇø´À» º¸ÀÚ.
template <typename T1, typename T2> class SomeClass { ... }
SomeClass Ŭ·¡½º ÅÛÇø´Àº µÎ °³ÀÇ Àμö¸¦ °¡Áö¹Ç·Î <int, int>, <int, double>, <short, unsigned> µî µÎ ŸÀÔÀÇ Á¶ÇÕÀ» ¸¶À½´ë·Î ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ºÎºÐ Ư¼öÈ´Â ÀÌ Áß ÇϳªÀÇ Å¸ÀÔÀº ¸¶À½´ë·Î ¼±ÅÃÇϵµ·Ï ±×´ë·Î µÎ°í ³ª¸ÓÁö Çϳª¿¡ ´ëÇØ¼¸¸ ŸÀÔÀ» °Á¦·Î ÁöÁ¤ÇÏ´Â °ÍÀÌ´Ù. T2°¡ doubleÀÎ °æ¿ì¿¡ ´ëÇØ¼¸¸ Ư¼öȸ¦ ÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
template <typename T1> class SomeClass<T1, double> { ... }
ÀÌ »óÅ¿¡¼ SomeClass<int, unsigned>³ª SomeClass<float, short>´Â Ư¼öȵÇÁö ¾ÊÀº ¹öÀüÀÇ ÅÛÇø´À¸·ÎºÎÅÍ »ý¼ºµÇÁö¸¸ SomeClass<int, double>À̳ª SomeClass<char, double>Àº ºÎºÐ Ư¼öÈµÈ ÅÛÇø´À¸·ÎºÎÅÍ »ý¼ºµÉ °ÍÀÌ´Ù. µÎ ¹øÂ° Àμö°¡ doubleÀΠŬ·¡½º¿¡ ´ëÇØ¼¸¸ ºÎºÐÀûÀ¸·Î Ư¼öȸ¦ Ç߱⠶§¹®ÀÌ´Ù. gcc´Â ºÎºÐ Ư¼öȸ¦ Áö¿øÇÏÁö¸¸ ºñÁÖ¾ó C++ 6.0¿¡¼´Â Áö¿øµÇÁö ¾Ê´Â´Ù.