- #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==