#include <iostream>
#include <type_traits>

class A; // forward declaration.

class A
{
public:
    int val;
    void print() const { std::cout << val << std::endl; }
    
    template <typename T>
    std::enable_if_t<std::is_same<int, T>::value, A&>
    operator=(const T& input){
        val = 2 * input; //Overload I
        return *this;
    }
    template <typename T>
    std::enable_if_t<std::is_same<A, T>::value, A&>
    operator=(T& rhs){
        val = 5 * rhs.val; //Overload II
        return *this;
    }
};

int main()
{
    A Aa;
    A Bb;
    int in_a = 3;
    Aa = in_a;
    Bb = Aa; 
    Aa.print(); //This should give 6. (3x2)
    Bb.print(); //This should give 30. (6x5)
}
