// 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 <> 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 << "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
template <> void Swap< job> ( 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;
}
Ly8gdHdvc3dhcC5jcHAgLS0gc3BlY2lhbGl6YXRpb24gb3ZlcnJpZGVzIGEgdGVtcGxhdGUKI2luY2x1ZGUgPGlvc3RyZWFtPgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBTd2FwKFQgJmEsIFQgJmIpOwoKc3RydWN0IGpvYgp7CiAgICBjaGFyIG5hbWVbNDBdOwogICAgZG91YmxlIHNhbGFyeTsKICAgIGludCBmbG9vcjsKfTsKCi8vIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uCnRlbXBsYXRlIDw+IHZvaWQgU3dhcDxqb2I+KGpvYiAmajEsIGpvYiAmajIpOwp2b2lkIFNob3coam9iICZqKTsKCmludCBtYWluKCkKewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIGNvdXQucHJlY2lzaW9uKDIpOwogICAgY291dC5zZXRmKGlvczo6Zml4ZWQsIGlvczo6ZmxvYXRmaWVsZCk7CiAgICBpbnQgaSA9IDEwLCBqID0gMjA7CiAgICBjb3V0IDw8ICJpLCBqID0gIiA8PCBpIDw8ICIsICIgPDwgaiA8PCAiLlxuIjsKICAgIGNvdXQgPDwgIlVzaW5nIGNvbXBpbGVyLWdlbmVyYXRlZCBpbnQgc3dhcHBlcjpcbiI7CiAgICBTd2FwKGksaik7ICAgIC8vIGdlbmVyYXRlcyB2b2lkIFN3YXAoaW50ICYsIGludCAmKQogICAgY291dCA8PCAiTm93IGksIGogPSAiIDw8IGkgPDwgIiwgIiA8PCBqIDw8ICIuXG4iOwoKICAgIGpvYiBzdWUgPSB7IlN1c2FuIFlhZmZlZSIsIDczMDAwLjYwLCA3fTsKICAgIGpvYiBzaWRuZXkgPSB7IlNpZG5leSBUYWZmZWUiLCA3ODA2MC43MiwgOX07CiAgICBjb3V0IDw8ICJCZWZvcmUgam9iIHN3YXBwaW5nOlxuIjsKICAgIFNob3coc3VlKTsKICAgIFNob3coc2lkbmV5KTsKICAgIFN3YXAoc3VlLCBzaWRuZXkpOyAvLyB1c2VzIHZvaWQgU3dhcChqb2IgJiwgam9iICYpCiAgICBjb3V0IDw8ICJBZnRlciBqb2Igc3dhcHBpbmc6XG4iOwogICAgU2hvdyhzdWUpOwogICAgU2hvdyhzaWRuZXkpOwogICAgLy8gY2luLmdldCgpOwogICAgcmV0dXJuIDA7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIFN3YXAoVCAmYSwgVCAmYikgICAgLy8gZ2VuZXJhbCB2ZXJzaW9uCnsKICAgIFQgdGVtcDsKICAgIHRlbXAgPSBhOwogICAgYSA9IGI7CiAgICBiID0gdGVtcDsKfQoKLy8gc3dhcHMganVzdCB0aGUgc2FsYXJ5IGFuZCBmbG9vciBmaWVsZHMgb2YgYSBqb2Igc3RydWN0dXJlCgp0ZW1wbGF0ZSA8PiB2b2lkIFN3YXA8am9iPihqb2IgJmoxLCBqb2IgJmoyKSAgLy8gc3BlY2lhbGl6YXRpb24KewogICAgZG91YmxlIHQxOwogICAgaW50IHQyOwogICAgdDEgPSBqMS5zYWxhcnk7CiAgICBqMS5zYWxhcnkgPSBqMi5zYWxhcnk7CiAgICBqMi5zYWxhcnkgPSB0MTsKICAgIHQyID0gajEuZmxvb3I7CiAgICBqMS5mbG9vciA9IGoyLmZsb29yOwogICAgajIuZmxvb3IgPSB0MjsKfQoKdm9pZCBTaG93KGpvYiAmaikKewogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIGNvdXQgPDwgai5uYW1lIDw8ICI6ICQiIDw8IGouc2FsYXJ5CiAgICAgICAgIDw8ICIgb24gZmxvb3IgIiA8PCBqLmZsb29yIDw8IGVuZGw7Cn0K