#include <iostream>
#include <string>
using namespace std;
class Foo {
public:
template <typename Type> Type get();
private:
int value = 10;
};
template <> int Foo::get() { return value; }
template <> string Foo::get() { return to_string(value); }
class Bar {
public:
template <typename Type> Type get();
private:
int value = 15;
};
template <> int Bar::get() { return value; }
template <> string Bar::get() { return to_string(value); }
class Elo {
public:
template <typename Type, typename F> Type get();
private:
Foo foo;
Bar bar;
};
template <> int Elo::get<int, Foo>() { return foo.get<int>(); }
template <> string Elo::get<string, Foo>() { return foo.get<string>(); }
template <> int Elo::get<int, Bar>() { return bar.get<int>(); }
template <> string Elo::get<string, Bar>() { return bar.get<string>(); }
int main() {
Elo e;
cout << e.get<int, Foo>() << endl;
cout << e.get<int, Bar>() << endl;
cout << e.get<string, Foo>() << endl;
cout << e.get<string, Bar>() << endl;
// cout<<e.get<int,Elo>()<<endl; blad kompilacji
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgRm9vIHsKcHVibGljOgogIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPiBUeXBlIGdldCgpOwoKcHJpdmF0ZToKICBpbnQgdmFsdWUgPSAxMDsKfTsKCnRlbXBsYXRlIDw+IGludCBGb286OmdldCgpIHsgcmV0dXJuIHZhbHVlOyB9CnRlbXBsYXRlIDw+IHN0cmluZyBGb286OmdldCgpIHsgcmV0dXJuIHRvX3N0cmluZyh2YWx1ZSk7IH0KCmNsYXNzIEJhciB7CnB1YmxpYzoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4gVHlwZSBnZXQoKTsKCnByaXZhdGU6CiAgaW50IHZhbHVlID0gMTU7Cn07Cgp0ZW1wbGF0ZSA8PiBpbnQgQmFyOjpnZXQoKSB7IHJldHVybiB2YWx1ZTsgfQp0ZW1wbGF0ZSA8PiBzdHJpbmcgQmFyOjpnZXQoKSB7IHJldHVybiB0b19zdHJpbmcodmFsdWUpOyB9CgpjbGFzcyBFbG8gewpwdWJsaWM6CiAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIHR5cGVuYW1lIEY+IFR5cGUgZ2V0KCk7Cgpwcml2YXRlOgogIEZvbyBmb287CiAgQmFyIGJhcjsKfTsKCnRlbXBsYXRlIDw+IGludCBFbG86OmdldDxpbnQsIEZvbz4oKSB7IHJldHVybiBmb28uZ2V0PGludD4oKTsgfQp0ZW1wbGF0ZSA8PiBzdHJpbmcgRWxvOjpnZXQ8c3RyaW5nLCBGb28+KCkgeyByZXR1cm4gZm9vLmdldDxzdHJpbmc+KCk7IH0KdGVtcGxhdGUgPD4gaW50IEVsbzo6Z2V0PGludCwgQmFyPigpIHsgcmV0dXJuIGJhci5nZXQ8aW50PigpOyB9CnRlbXBsYXRlIDw+IHN0cmluZyBFbG86OmdldDxzdHJpbmcsIEJhcj4oKSB7IHJldHVybiBiYXIuZ2V0PHN0cmluZz4oKTsgfQoKaW50IG1haW4oKSB7CiAgRWxvIGU7CiAgY291dCA8PCBlLmdldDxpbnQsIEZvbz4oKSA8PCBlbmRsOwogIGNvdXQgPDwgZS5nZXQ8aW50LCBCYXI+KCkgPDwgZW5kbDsKICBjb3V0IDw8IGUuZ2V0PHN0cmluZywgRm9vPigpIDw8IGVuZGw7CiAgY291dCA8PCBlLmdldDxzdHJpbmcsIEJhcj4oKSA8PCBlbmRsOwogIC8vIGNvdXQ8PGUuZ2V0PGludCxFbG8+KCk8PGVuZGw7IGJsYWQga29tcGlsYWNqaQogIHJldHVybiAwOwp9