struct Number;
struct Int {
int v;
operator Number();
};
struct Double {
double v;
operator Number();
};
struct Number {
double v;
};
Int::operator Number() { Number ret; ret.v = v; return ret; }
Double::operator Number() { Number ret; ret.v = v; return ret; }
template<typename T, typename U>
auto tern(bool condition, T& truereturn, U& falsereturn)->decltype(condition ? truereturn : falsereturn)
{
return condition ? truereturn : falsereturn;
}
int main() {
Int i; Double d;
i.v = 0;
d.v = 1.;
Number j;
j = tern(i.v < d.v, i, d);
return 0;
}
c3RydWN0IE51bWJlcjsKc3RydWN0IEludCB7CglpbnQgdjsKCW9wZXJhdG9yIE51bWJlcigpOwp9OwoKc3RydWN0IERvdWJsZSB7Cglkb3VibGUgdjsKCW9wZXJhdG9yIE51bWJlcigpOwp9OwoKc3RydWN0IE51bWJlciB7Cglkb3VibGUgdjsKfTsKCkludDo6b3BlcmF0b3IgTnVtYmVyKCkgeyBOdW1iZXIgcmV0OyByZXQudiA9IHY7IHJldHVybiByZXQ7IH0KRG91YmxlOjpvcGVyYXRvciBOdW1iZXIoKSB7IE51bWJlciByZXQ7IHJldC52ID0gdjsgcmV0dXJuIHJldDsgfQoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KYXV0byB0ZXJuKGJvb2wgY29uZGl0aW9uLCBUJiB0cnVlcmV0dXJuLCBVJiBmYWxzZXJldHVybiktPmRlY2x0eXBlKGNvbmRpdGlvbiA/IHRydWVyZXR1cm4gOiBmYWxzZXJldHVybikKewoJcmV0dXJuIGNvbmRpdGlvbiA/IHRydWVyZXR1cm4gOiBmYWxzZXJldHVybjsKfQoKaW50IG1haW4oKSB7CglJbnQgaTsgRG91YmxlIGQ7CglpLnYgPSAwOwoJZC52ID0gMS47CgkKCU51bWJlciBqOwoJaiA9IHRlcm4oaS52IDwgZC52LCBpLCBkKTsKCglyZXR1cm4gMDsKfQ==