#include <complex>
#include <functional>
#include <utility>
template <class A, class B>
class X {
public:
A a;
B b;
X(A a, B b) : a(a), b(b) {}
X(const std::pair<A, B> &value) : a(value.first), b(value.second) {}
template <class C,template <typename, typename> typename O >
friend X<A, C> operator+(const X<A, B> &left, const O<B, C> &right) {
return left + X<B,C>(right);
}
template <class C>
friend X<A, C> operator+(const X<A, B> &left, const X<B, C> &right) {
return X<A, C>(left.a,right.b);
}
};
int main() {
X<int, int> a(1, 2);
X<int, float> b(1, 2.5f);
std::pair<int, float> c(1, 2.5f);
a + b; // Valid
a + c; // Works
}
I2luY2x1ZGUgPGNvbXBsZXg+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCPgpjbGFzcyBYIHsKcHVibGljOgogICAgQSBhOwogICAgQiBiOwoKICAgIFgoQSBhLCBCIGIpIDogYShhKSwgYihiKSB7fQogICAgWChjb25zdCBzdGQ6OnBhaXI8QSwgQj4gJnZhbHVlKSA6IGEodmFsdWUuZmlyc3QpLCBiKHZhbHVlLnNlY29uZCkge30KCgogICAgdGVtcGxhdGUgPGNsYXNzIEMsdGVtcGxhdGUgPHR5cGVuYW1lLCB0eXBlbmFtZT4gdHlwZW5hbWUgTyA+CiAgICBmcmllbmQgWDxBLCBDPiBvcGVyYXRvcisoY29uc3QgWDxBLCBCPiAmbGVmdCwgY29uc3QgTzxCLCBDPiAmcmlnaHQpIHsKICAgICAgIHJldHVybiBsZWZ0ICsgWDxCLEM+KHJpZ2h0KTsKICAgIH0KICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgZnJpZW5kIFg8QSwgQz4gb3BlcmF0b3IrKGNvbnN0IFg8QSwgQj4gJmxlZnQsIGNvbnN0IFg8QiwgQz4gJnJpZ2h0KSB7CiAgICAgICByZXR1cm4gWDxBLCBDPihsZWZ0LmEscmlnaHQuYik7CiAgICB9Cn07CgoKaW50IG1haW4oKSB7CiAgICBYPGludCwgaW50PiBhKDEsIDIpOwogICAgWDxpbnQsIGZsb2F0PiBiKDEsIDIuNWYpOwogICAgc3RkOjpwYWlyPGludCwgZmxvYXQ+IGMoMSwgMi41Zik7CgogICAgYSArIGI7IC8vIFZhbGlkCiAgICBhICsgYzsgLy8gV29ya3MKfQ==