#include <iostream>
#include <algorithm>
using namespace std;
class CompareOptionalInfo {};
class CompareResult
{
public:
CompareResult(double d=0.0) : confidence_(d) {};
operator double() { cout<<"(dbl conversion was used)"<<endl; return confidence_; }
operator bool() { cout<<"(bool conversion was used)"<<endl; return confidence_>0.5; }
bool operator< (const CompareResult& x) const { return confidence_<x.confidence_; }
private:
double confidence_;
CompareOptionalInfo compare_optional_info_;
};
struct Foo
{
double d;
static CompareResult Compare(const Foo& foo1, const Foo& foo2) { if (foo1.d==foo2.d) return true; else return 1.0/(foo1.d-foo2.d); }
};
int main() {
Foo f1,f2,f3;
f1.d =1.3; f2.d=1.4; f3.d=5.0;
auto result = Foo::Compare (f1, f2);
if (result) cout << "similar";
if ((double)result>0.0) cout << "not fully different";
auto closest = std::max(Foo::Compare (f1, f2), Foo::Compare (f2, f3));
cout << "closest:"<<(double)closest<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQ29tcGFyZU9wdGlvbmFsSW5mbyB7fTsKY2xhc3MgQ29tcGFyZVJlc3VsdAp7CnB1YmxpYzoKICBDb21wYXJlUmVzdWx0KGRvdWJsZSBkPTAuMCkgOiBjb25maWRlbmNlXyhkKSB7fTsgCiAgb3BlcmF0b3IgZG91YmxlKCkgeyBjb3V0PDwiKGRibCBjb252ZXJzaW9uIHdhcyB1c2VkKSI8PGVuZGw7IHJldHVybiBjb25maWRlbmNlXzsgfQogIG9wZXJhdG9yIGJvb2woKSB7IGNvdXQ8PCIoYm9vbCBjb252ZXJzaW9uIHdhcyB1c2VkKSI8PGVuZGw7IHJldHVybiBjb25maWRlbmNlXz4wLjU7IH0JCiAgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IENvbXBhcmVSZXN1bHQmIHgpIGNvbnN0IHsgcmV0dXJuIGNvbmZpZGVuY2VfPHguY29uZmlkZW5jZV87IH0KcHJpdmF0ZToKICBkb3VibGUgY29uZmlkZW5jZV87CiAgQ29tcGFyZU9wdGlvbmFsSW5mbyBjb21wYXJlX29wdGlvbmFsX2luZm9fOwp9OwoKc3RydWN0IEZvbwp7Cglkb3VibGUgZDsgCiAgICBzdGF0aWMgQ29tcGFyZVJlc3VsdCBDb21wYXJlKGNvbnN0IEZvbyYgZm9vMSwgY29uc3QgRm9vJiBmb28yKSB7IGlmIChmb28xLmQ9PWZvbzIuZCkgcmV0dXJuIHRydWU7IGVsc2UgcmV0dXJuIDEuMC8oZm9vMS5kLWZvbzIuZCk7IH0KfTsKCgppbnQgbWFpbigpIHsKCUZvbyBmMSxmMixmMzsgCglmMS5kID0xLjM7IGYyLmQ9MS40OyBmMy5kPTUuMDsgCglhdXRvIHJlc3VsdCA9IEZvbzo6Q29tcGFyZSAoZjEsIGYyKTsKCWlmIChyZXN1bHQpIGNvdXQgPDwgInNpbWlsYXIiOyAKCWlmICgoZG91YmxlKXJlc3VsdD4wLjApIGNvdXQgPDwgIm5vdCBmdWxseSBkaWZmZXJlbnQiOyAKCWF1dG8gY2xvc2VzdCA9IHN0ZDo6bWF4KEZvbzo6Q29tcGFyZSAoZjEsIGYyKSwgRm9vOjpDb21wYXJlIChmMiwgZjMpKTsgCgljb3V0IDw8ICJjbG9zZXN0OiI8PChkb3VibGUpY2xvc2VzdDw8ZW5kbDsgCgkKCXJldHVybiAwOwp9