#include <iostream>
template <typename T>
void my_swap(T &a,T &b)
{
T temp = std::move(a);
a = std::move(b);
b = std::move(temp);
/* or:
using std::swap;
swap(a, b);
*/
}
struct Men
{
std::string name;
int age;
};
template <>
void my_swap<Men>(Men &a, Men &b)
{
int temp = a.age;
a.age = b.age;
b.age = temp;
/* or:
std::swap(a.age, b.age);
*/
}
std::ostream &operator<<(std::ostream &os, const Men &M)
{
os << M.name << " is " << M.age;
return os;
}
int main()
{
int x{100};
int y{200};
my_swap(x, y);
std::cout << x << "," << y << std::endl;
Men M1{"Jack", 10};
Men M2{"Tony", 20};
my_swap(M1, M2);
std::cout << M1 << "," << M2 << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgbXlfc3dhcChUICZhLFQgJmIpCnsKICAgIFQgdGVtcCA9IHN0ZDo6bW92ZShhKTsKICAgIGEgPSBzdGQ6Om1vdmUoYik7CiAgICBiID0gc3RkOjptb3ZlKHRlbXApOwoKICAgIC8qIG9yOgogICAgdXNpbmcgc3RkOjpzd2FwOwogICAgc3dhcChhLCBiKTsKICAgICovCn0KCnN0cnVjdCBNZW4KewogICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgIGludCBhZ2U7Cn07Cgp0ZW1wbGF0ZSA8Pgp2b2lkIG15X3N3YXA8TWVuPihNZW4gJmEsIE1lbiAmYikKewogICAgaW50IHRlbXAgPSBhLmFnZTsKICAgIGEuYWdlID0gYi5hZ2U7CiAgICBiLmFnZSA9IHRlbXA7CgogICAgLyogb3I6CiAgICBzdGQ6OnN3YXAoYS5hZ2UsIGIuYWdlKTsKICAgICovCn0KCnN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBNZW4gJk0pCnsKICAgIG9zIDw8IE0ubmFtZSA8PCAiIGlzICIgPDwgTS5hZ2U7CiAgICByZXR1cm4gb3M7Cn0KCmludCBtYWluKCkKewogICAgaW50IHh7MTAwfTsKICAgIGludCB5ezIwMH07CiAgICBteV9zd2FwKHgsIHkpOwogICAgc3RkOjpjb3V0IDw8IHggPDwgIiwiIDw8IHkgPDwgc3RkOjplbmRsOwoKICAgIE1lbiBNMXsiSmFjayIsIDEwfTsKICAgIE1lbiBNMnsiVG9ueSIsIDIwfTsKICAgIG15X3N3YXAoTTEsIE0yKTsKICAgIHN0ZDo6Y291dCA8PCBNMSA8PCAiLCIgPDwgTTIgPDwgc3RkOjplbmRsOwogICAgCiAgICByZXR1cm4gMDsKfQ==