#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;
}