Soft Ware/C++ 언어!!

구도체 및 클래스시 어느 멤버 변수만 Swap 할때(명시적 특수화)

달려가보자 2011. 10. 22. 06:15
#include <iostream>

template <class Any>
void Swap(Any &a, Any &b);

struct job
{
char name[40];
double salary;
int floor;
};

template <>void Swap<job>(job &j1, job &j2);
void Show(job &j);

int main()
{
using namespace std;
cout.precision(2); // ()안에 있는 숫자에 맞게 길이를 출력한다는 뜻
cout.setf(ios::fixed, ios::floatfield);
int i = 10, j = 20;
cout<<"i,j = "<<i<<","<<j<<".\n";
cout<<"컴파일러가 생성한 int형 교환기를 사용하면\n";
Swap(i,j);
cout<<"이제 i,j = "<<i<<","<<j<<".\n";


job sue = {"Susan Yaffee",73000.60,7};
job sidney = {"Sidney Taffee",78060.72, 9};
cout<<"job 교환전:\n";
Show(sue);
Show(sidney);
Swap(sue,sidney);
cout<<"job 교환후:\n";
Show(sue);
Show(sidney);

return 0;
}

template <typename Any>
void Swap(Any &a,Any &b)
{
Any temp;
temp = a;
a = b;
b = temp;
}

template <>void Swap<job>(job &j1, job &j2)
{
double t1;
int t2;
t1 = j1.salary;
j1.salary = j2.salary;
j2.salary = t1;
t2 = j1.floor;
j1.floor = j2.floor;
j2.floor = t2;
}

void Show(job &j)
{
using namespace std;
cout<<j.name<<": ("<<j.floor<<"층에 거주)"
<<"$"<<j.salary<<endl;
}

이소스는 구도체(C++에서는 구도체도 클래스이다)에서 특정 멤버 변수만 교체를 할때 명시적 특수화

템플릿을 통해서 Swap 이 가능하다  

여기서 template <>void Swap(job &j1, job &j2);

이렇게 Swap다음에 <job>을 생략할수 있다 그이유는 인자값을 넘겨줄때 컴파일러가 미리 무슨형인지

알기 때문에 생략이 가능하다 

'Soft Ware > C++ 언어!!' 카테고리의 다른 글

함수 오버로딩 때 순서  (0) 2011.10.22
템플릿의 구체화 및 특수화  (0) 2011.10.22
Template 을 이용한 Swap  (0) 2011.10.22
확률 계산 시 부동소수점 오버플로  (0) 2011.10.21
cout 의 입력큐 초기화  (0) 2011.10.20