// twoswap.cpp -- specialization overrides a template
#include <iostream>
template < typename T>
void Swap( T & a, T & b) ;
struct job
{
char name[ 40 ] ;
double salary;
int floor ;
} ;
// explicit specialization
template < typename job>
void Swap( 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 << "Using compiler-generated int swapper:\n " ;
Swap( i,j) ; // generates void Swap(int &, int &)
cout << "Now i, j = " << i << ", " << j << ".\n " ;
job sue = { "Susan Yaffee" , 73000.60 , 7 } ;
job sidney = { "Sidney Taffee" , 78060.72 , 9 } ;
cout << "Before job swapping:\n " ;
Show( sue) ;
Show( sidney) ;
Swap( sue, sidney) ; // uses void Swap(job &, job &)
cout << "After job swapping:\n " ;
Show( sue) ;
Show( sidney) ;
// cin.get();
return 0 ;
}
template < typename T>
void Swap( T & a, T & b) // general version
{
T temp;
temp = a;
a = b;
b = temp;
}
// swaps just the salary and floor fields of a job structure
void Swap( job & j1, job & j2) // specialization
{
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.salary
<< " on floor " << j.floor << endl;
}
Ly8gdHdvc3dhcC5jcHAgLS0gc3BlY2lhbGl6YXRpb24gb3ZlcnJpZGVzIGEgdGVtcGxhdGUKI2luY2x1ZGUgPGlvc3RyZWFtPgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBTd2FwKFQgJmEsIFQgJmIpOwoKc3RydWN0IGpvYgp7CiAgICBjaGFyIG5hbWVbNDBdOwogICAgZG91YmxlIHNhbGFyeTsKICAgIGludCBmbG9vcjsKfTsKCi8vIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uCnRlbXBsYXRlIDx0eXBlbmFtZSBqb2I+CnZvaWQgU3dhcChqb2IgJmoxLCBqb2IgJmoyKTsKdm9pZCBTaG93KGpvYiAmaik7CgppbnQgbWFpbigpCnsKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICBjb3V0LnByZWNpc2lvbigyKTsKICAgIGNvdXQuc2V0Zihpb3M6OmZpeGVkLCBpb3M6OmZsb2F0ZmllbGQpOwogICAgaW50IGkgPSAxMCwgaiA9IDIwOwogICAgY291dCA8PCAiaSwgaiA9ICIgPDwgaSA8PCAiLCAiIDw8IGogPDwgIi5cbiI7CiAgICBjb3V0IDw8ICJVc2luZyBjb21waWxlci1nZW5lcmF0ZWQgaW50IHN3YXBwZXI6XG4iOwogICAgU3dhcChpLGopOyAgICAvLyBnZW5lcmF0ZXMgdm9pZCBTd2FwKGludCAmLCBpbnQgJikKICAgIGNvdXQgPDwgIk5vdyBpLCBqID0gIiA8PCBpIDw8ICIsICIgPDwgaiA8PCAiLlxuIjsKCiAgICBqb2Igc3VlID0geyJTdXNhbiBZYWZmZWUiLCA3MzAwMC42MCwgN307CiAgICBqb2Igc2lkbmV5ID0geyJTaWRuZXkgVGFmZmVlIiwgNzgwNjAuNzIsIDl9OwogICAgY291dCA8PCAiQmVmb3JlIGpvYiBzd2FwcGluZzpcbiI7CiAgICBTaG93KHN1ZSk7CiAgICBTaG93KHNpZG5leSk7CiAgICBTd2FwKHN1ZSwgc2lkbmV5KTsgLy8gdXNlcyB2b2lkIFN3YXAoam9iICYsIGpvYiAmKQogICAgY291dCA8PCAiQWZ0ZXIgam9iIHN3YXBwaW5nOlxuIjsKICAgIFNob3coc3VlKTsKICAgIFNob3coc2lkbmV5KTsKICAgIC8vIGNpbi5nZXQoKTsKICAgIHJldHVybiAwOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBTd2FwKFQgJmEsIFQgJmIpICAgIC8vIGdlbmVyYWwgdmVyc2lvbgp7CiAgICBUIHRlbXA7CiAgICB0ZW1wID0gYTsKICAgIGEgPSBiOwogICAgYiA9IHRlbXA7Cn0KCi8vIHN3YXBzIGp1c3QgdGhlIHNhbGFyeSBhbmQgZmxvb3IgZmllbGRzIG9mIGEgam9iIHN0cnVjdHVyZQoKdm9pZCBTd2FwKGpvYiAmajEsIGpvYiAmajIpICAvLyBzcGVjaWFsaXphdGlvbgp7CiAgICBkb3VibGUgdDE7CiAgICBpbnQgdDI7CiAgICB0MSA9IGoxLnNhbGFyeTsKICAgIGoxLnNhbGFyeSA9IGoyLnNhbGFyeTsKICAgIGoyLnNhbGFyeSA9IHQxOwogICAgdDIgPSBqMS5mbG9vcjsKICAgIGoxLmZsb29yID0gajIuZmxvb3I7CiAgICBqMi5mbG9vciA9IHQyOwp9Cgp2b2lkIFNob3coam9iICZqKQp7CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgY291dCA8PCBqLm5hbWUgPDwgIjogJCIgPDwgai5zYWxhcnkKICAgICAgICAgPDwgIiBvbiBmbG9vciAiIDw8IGouZmxvb3IgPDwgZW5kbDsKfQo=