#include <type_traits>
template<typename U>
struct Explicit
{
bool value;
template<typename T = U, typename = std::enable_if_t<std::is_same<std::decay_t<T>, U>::value>>
Explicit(T&& value) : value(value) { }
operator U() { return value; }
};
void Foo(Explicit<bool> arg1 = false, int arg2 = 10, int arg3 = 20) { }
int main(int argc, char ** argv)
{
int x = 40, y = 50;
Foo();
Foo(true, x, y);
Foo((bool)x, y);
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgVT4Kc3RydWN0IEV4cGxpY2l0CnsKCWJvb2wgdmFsdWU7Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gVSwgdHlwZW5hbWUgPSBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxzdGQ6OmRlY2F5X3Q8VD4sIFU+Ojp2YWx1ZT4+CglFeHBsaWNpdChUJiYgdmFsdWUpIDogdmFsdWUodmFsdWUpIHsgfQoJb3BlcmF0b3IgVSgpIHsgcmV0dXJuIHZhbHVlOyB9Cn07Cgp2b2lkIEZvbyhFeHBsaWNpdDxib29sPiBhcmcxID0gZmFsc2UsIGludCBhcmcyID0gMTAsIGludCBhcmczID0gMjApIHsgfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKewoJaW50IHggPSA0MCwgeSA9IDUwOwoJRm9vKCk7CglGb28odHJ1ZSwgeCwgeSk7CglGb28oKGJvb2wpeCwgeSk7Cn0=