#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;
}