#include <type_traits>
#include <utility>
template<typename T1, typename... Types>
class Base
{
public:
//assignment to base or derived class
template<typename T, typename std::enable_if<std::is_base_of<Base<T1, Types...>, typename std::decay<T>::type>::value>::type* = nullptr>
Base& operator=(T&& other)
{
if (this != &other)
a = other.a;
return *this;
}
//assignment to other type contained in <T1, Types...>
template<typename T, typename std::enable_if<!std::is_base_of<Base<T1, Types...>, typename std::decay<T>::type>::value>::type* = nullptr>
Base& operator=(T&& other)
{
// do some stuff
return *this;
}
private:
int a;
};
class Derived : public Base<int, double>
{
public:
// similar pattern here, but call base class' operators
// for both copy/move assignment
// as well as assignment to int or double
template<typename T>
Derived& operator=(T&& other)
{
Base<int, double>::operator=(std::forward<T>(other));
return *this;
}
};
int main() {
Derived foo;
int a = 4;
foo = a;
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZS4uLiBUeXBlcz4KY2xhc3MgQmFzZQp7CglwdWJsaWM6CgkvL2Fzc2lnbm1lbnQgdG8gYmFzZSBvciBkZXJpdmVkIGNsYXNzCgl0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8QmFzZTxUMSwgVHlwZXMuLi4+LCB0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlPjo6dmFsdWU+Ojp0eXBlKiA9IG51bGxwdHI+CglCYXNlJiBvcGVyYXRvcj0oVCYmIG90aGVyKQoJewoJCWlmICh0aGlzICE9ICZvdGhlcikKCQkJYSA9IG90aGVyLmE7CgkJcmV0dXJuICp0aGlzOwoJfQoJCgkvL2Fzc2lnbm1lbnQgdG8gb3RoZXIgdHlwZSBjb250YWluZWQgaW4gPFQxLCBUeXBlcy4uLj4KCSB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19iYXNlX29mPEJhc2U8VDEsIFR5cGVzLi4uPiwgdHlwZW5hbWUgc3RkOjpkZWNheTxUPjo6dHlwZT46OnZhbHVlPjo6dHlwZSogPSBudWxscHRyPgoJQmFzZSYgb3BlcmF0b3I9KFQmJiBvdGhlcikKCXsKCQkvLyBkbyBzb21lIHN0dWZmCgkJcmV0dXJuICp0aGlzOwoJfQoJCgkKCXByaXZhdGU6CglpbnQgYTsKfTsKCmNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZTxpbnQsIGRvdWJsZT4KewoJcHVibGljOgoJLy8gc2ltaWxhciBwYXR0ZXJuIGhlcmUsIGJ1dCBjYWxsIGJhc2UgY2xhc3MnIG9wZXJhdG9ycwoJLy8gZm9yIGJvdGggY29weS9tb3ZlIGFzc2lnbm1lbnQKCS8vIGFzIHdlbGwgYXMgYXNzaWdubWVudCB0byBpbnQgb3IgZG91YmxlCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJRGVyaXZlZCYgb3BlcmF0b3I9KFQmJiBvdGhlcikKCXsKCQlCYXNlPGludCwgZG91YmxlPjo6b3BlcmF0b3I9KHN0ZDo6Zm9yd2FyZDxUPihvdGhlcikpOwoJCXJldHVybiAqdGhpczsKCX0KfTsKCmludCBtYWluKCkgewoJRGVyaXZlZCBmb287CglpbnQgYSA9IDQ7Cglmb28gPSBhOwoJcmV0dXJuIDA7Cn0=