#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
struct Validated
{
private:
T m_value;
bool m_isValid;
public:
Validated() : m_value(), m_isValid(false) {}
explicit Validated(T const& value) : m_value(value), m_isValid(true) {}
template <typename Y=T,typename std::enable_if<!std::is_same<Y,bool>::value,int>::type =0>
explicit Validated(bool const& value) = delete;
explicit Validated(bool isValid, T const& value) : m_value(value), m_isValid(isValid) {}
explicit Validated(bool isValid, T&& value) : m_value(value), m_isValid(isValid) {}
bool IsValid() const { return m_isValid; }
T const& Value() const { return m_value; }
};
int main() {
Validated<bool> v(true);
//Validated<int> v2(true); //fails
Validated<int> v2(2);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IFZhbGlkYXRlZAp7CnByaXZhdGU6CiAgICBUIG1fdmFsdWU7CiAgICBib29sIG1faXNWYWxpZDsKCnB1YmxpYzoKICAgIFZhbGlkYXRlZCgpIDogbV92YWx1ZSgpLCBtX2lzVmFsaWQoZmFsc2UpIHt9CiAgICAKCiAgICBleHBsaWNpdCBWYWxpZGF0ZWQoVCBjb25zdCYgdmFsdWUpIDogbV92YWx1ZSh2YWx1ZSksIG1faXNWYWxpZCh0cnVlKSB7fQogICAgCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgWT1ULHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8WSxib29sPjo6dmFsdWUsaW50Pjo6dHlwZSA9MD4KICAgIGV4cGxpY2l0IFZhbGlkYXRlZChib29sIGNvbnN0JiB2YWx1ZSkgPSBkZWxldGU7CiAgICAKICAgIGV4cGxpY2l0IFZhbGlkYXRlZChib29sIGlzVmFsaWQsIFQgY29uc3QmIHZhbHVlKSA6IG1fdmFsdWUodmFsdWUpLCBtX2lzVmFsaWQoaXNWYWxpZCkge30KICAgIGV4cGxpY2l0IFZhbGlkYXRlZChib29sIGlzVmFsaWQsIFQmJiB2YWx1ZSkgOiBtX3ZhbHVlKHZhbHVlKSwgbV9pc1ZhbGlkKGlzVmFsaWQpIHt9ICAgIAoKICAgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNWYWxpZDsgfQogICAgVCBjb25zdCYgVmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9Cn07CgppbnQgbWFpbigpIHsKCVZhbGlkYXRlZDxib29sPiB2KHRydWUpOwoJLy9WYWxpZGF0ZWQ8aW50PiB2Mih0cnVlKTsgLy9mYWlscwoJVmFsaWRhdGVkPGludD4gdjIoMik7CglyZXR1cm4gMDsKfQ==