#include <iostream>
using std::cout;
using std::endl;
class my_bool {
private:
bool value;
public:
my_bool(bool value) : value(value) {}
explicit operator bool() { return value; };
friend my_bool operator==(const my_bool & instance_1, const my_bool & instance_2) {
return instance_1.value == instance_2.value;
}
friend my_bool operator&&(const my_bool & instance_1, const my_bool & instance_2) {
cout << "FOOOOOOOOO bar" << endl;
return instance_1.value && instance_2.value;
}
friend my_bool operator&&(const my_bool & lhs, bool rhs) {
return lhs && my_bool(rhs);
}
friend my_bool operator&&(bool lhs, const my_bool & rhs) {
return my_bool(lhs) && rhs;
}
};
int main(int, char **){
my_bool a = true;
bool b = false;
if(a == b){
// do something
}
if(b && a){
// do something
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBzdGQ6OmNvdXQ7CnVzaW5nIHN0ZDo6ZW5kbDsKCmNsYXNzIG15X2Jvb2wgewogIHByaXZhdGU6CiAgICBib29sIHZhbHVlOwogIHB1YmxpYzoKICAgIG15X2Jvb2woYm9vbCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkge30KICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiB2YWx1ZTsgfTsKCiAgICBmcmllbmQgbXlfYm9vbCBvcGVyYXRvcj09KGNvbnN0IG15X2Jvb2wgJiBpbnN0YW5jZV8xLCBjb25zdCBteV9ib29sICYgaW5zdGFuY2VfMikgewogICAgCXJldHVybiBpbnN0YW5jZV8xLnZhbHVlID09IGluc3RhbmNlXzIudmFsdWU7CiAgICB9CiAgICBmcmllbmQgbXlfYm9vbCBvcGVyYXRvciYmKGNvbnN0IG15X2Jvb2wgJiBpbnN0YW5jZV8xLCBjb25zdCBteV9ib29sICYgaW5zdGFuY2VfMikgewogICAgCWNvdXQgPDwgIkZPT09PT09PT08gYmFyIiA8PCBlbmRsOwogICAgCXJldHVybiBpbnN0YW5jZV8xLnZhbHVlICYmIGluc3RhbmNlXzIudmFsdWU7CiAgICB9CiAgICBmcmllbmQgbXlfYm9vbCBvcGVyYXRvciYmKGNvbnN0IG15X2Jvb2wgJiBsaHMsIGJvb2wgcmhzKSB7CiAgICAJcmV0dXJuIGxocyAmJiBteV9ib29sKHJocyk7CiAgICB9CiAgICBmcmllbmQgbXlfYm9vbCBvcGVyYXRvciYmKGJvb2wgbGhzLCBjb25zdCBteV9ib29sICYgcmhzKSB7CiAgICAJcmV0dXJuIG15X2Jvb2wobGhzKSAmJiByaHM7CiAgICB9Cgp9OwoKaW50IG1haW4oaW50LCBjaGFyICoqKXsKICBteV9ib29sIGEgPSB0cnVlOwogIGJvb2wgYiA9IGZhbHNlOwoKICBpZihhID09IGIpewogICAgLy8gZG8gc29tZXRoaW5nCiAgfQoKICBpZihiICYmIGEpewogICAgLy8gZG8gc29tZXRoaW5nIAogIH0KICByZXR1cm4gMDsKfQ==