#include <iostream>
using namespace std;
class IComparable {
public:
virtual bool Equal(const IComparable&) = 0;
typedef int IsComparable;
};
class Foo : public IComparable {
public: bool Equal(const IComparable&) {
return true;
}
};
template <typename Comparable>
void compare(const Comparable& cmp, const Comparable& cmp2) {
typedef typename Comparable::IsComparable Guard;
}
int main() {
Foo f;
compare(f, f);
//compare(10, 20);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSUNvbXBhcmFibGUgewoJcHVibGljOiAKCQl2aXJ0dWFsIGJvb2wgRXF1YWwoY29uc3QgSUNvbXBhcmFibGUmKSA9IDA7CgkJCgkJdHlwZWRlZiBpbnQgSXNDb21wYXJhYmxlOwp9OwoKY2xhc3MgRm9vIDogcHVibGljIElDb21wYXJhYmxlIHsKCXB1YmxpYzogYm9vbCBFcXVhbChjb25zdCBJQ29tcGFyYWJsZSYpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBDb21wYXJhYmxlPgp2b2lkIGNvbXBhcmUoY29uc3QgQ29tcGFyYWJsZSYgY21wLCBjb25zdCBDb21wYXJhYmxlJiBjbXAyKSB7Cgl0eXBlZGVmIHR5cGVuYW1lIENvbXBhcmFibGU6OklzQ29tcGFyYWJsZSBHdWFyZDsKfQoKaW50IG1haW4oKSB7CglGb28gZjsKCWNvbXBhcmUoZiwgZik7CgkvL2NvbXBhcmUoMTAsIDIwKTsKCXJldHVybiAwOwp9