#include <string>
template<typename T> struct Const {
explicit Const(T val) : value(val) {}
T value;
};
template<typename T> struct Var {
explicit Var(const std::string &n) : name(n) {}
std::string name;
};
template<typename L, typename R> struct Greater {
Greater(L lhs, R rhs) : left(lhs), right(rhs) {}
L left;
R right;
};
//
template<typename L>
Greater<L, Const<int> > operator > (L lhs, int rhs) {
return Greater<L, Const<int> >(lhs, Const<int>(rhs));
}
//
template<typename R>
Greater<Const<int>, R> operator > (int lhs, R rhs) {
return Greater<Const<int>, R>(Const<int>(lhs), rhs);
}
Var<double> d("d");
int main(int argc, char *argv[]) {
d > 10;
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBDb25zdCB7IAogICAgZXhwbGljaXQgQ29uc3QoVCB2YWwpIDogdmFsdWUodmFsKSB7fQogICAgVCB2YWx1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBWYXIgewogICAgZXhwbGljaXQgVmFyKGNvbnN0IHN0ZDo6c3RyaW5nICZuKSA6IG5hbWUobikge30KCiAgICBzdGQ6OnN0cmluZyBuYW1lOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgTCwgdHlwZW5hbWUgUj4gc3RydWN0IEdyZWF0ZXIgewogICAgR3JlYXRlcihMIGxocywgUiByaHMpIDogbGVmdChsaHMpLCByaWdodChyaHMpIHt9CgogICAgTCBsZWZ0OwogICAgUiByaWdodDsKfTsKCi8vCnRlbXBsYXRlPHR5cGVuYW1lIEw+CkdyZWF0ZXI8TCwgQ29uc3Q8aW50PiA+IG9wZXJhdG9yID4gKEwgbGhzLCBpbnQgcmhzKSB7IAogICAgcmV0dXJuIEdyZWF0ZXI8TCwgQ29uc3Q8aW50PiA+KGxocywgQ29uc3Q8aW50PihyaHMpKTsKfQoKCi8vCnRlbXBsYXRlPHR5cGVuYW1lIFI+CkdyZWF0ZXI8Q29uc3Q8aW50PiwgUj4gb3BlcmF0b3IgPiAoaW50IGxocywgUiByaHMpIHsgCiAgICByZXR1cm4gR3JlYXRlcjxDb25zdDxpbnQ+LCBSPihDb25zdDxpbnQ+KGxocyksIHJocyk7Cn0KClZhcjxkb3VibGU+IGQoImQiKTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICBkID4gMTA7CiAgICAgcmV0dXJuIDA7Cn0=