#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)
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpjbGFzcyBBOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uLgoKY2xhc3MgQQp7CnB1YmxpYzoKICAgIGludCB2YWw7CiAgICB2b2lkIHByaW50KCkgY29uc3QgeyBzdGQ6OmNvdXQgPDwgdmFsIDw8IHN0ZDo6ZW5kbDsgfQogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPGludCwgVD46OnZhbHVlLCBBJj4KICAgIG9wZXJhdG9yPShjb25zdCBUJiBpbnB1dCl7CiAgICAgICAgdmFsID0gMiAqIGlucHV0OyAvL092ZXJsb2FkIEkKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHN0ZDo6ZW5hYmxlX2lmX3Q8c3RkOjppc19zYW1lPEEsIFQ+Ojp2YWx1ZSwgQSY+CiAgICBvcGVyYXRvcj0oVCYgcmhzKXsKICAgICAgICB2YWwgPSA1ICogcmhzLnZhbDsgLy9PdmVybG9hZCBJSQogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgQSBBYTsKICAgIEEgQmI7CiAgICBpbnQgaW5fYSA9IDM7CiAgICBBYSA9IGluX2E7CiAgICBCYiA9IEFhOyAKICAgIEFhLnByaW50KCk7IC8vVGhpcyBzaG91bGQgZ2l2ZSA2LiAoM3gyKQogICAgQmIucHJpbnQoKTsgLy9UaGlzIHNob3VsZCBnaXZlIDMwLiAoNng1KQp9Cg==