#include <iostream>
#include <functional>
#include <cassert>
using namespace std;
template<
typename T,
T minVal,
T maxVal,
typename Compare = less<T>>
class RangedVal{
public:
using value_type = T;
using compare_type = Compare;
static constexpr value_type min = minVal;
static constexpr value_type max = maxVal;
static constexpr compare_type compare = compare_type();
static constexpr bool check(value_type val){
return compare(min, val) && compare(val, max);
}
private:
value_type value;
public:
constexpr RangedVal(value_type val): value(check(val)? val : throw val){}
constexpr operator value_type() const{
return value;
}
};
int main() {
RangedVal<int, 0, 6> val(3);
cout << val << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGNhc3NlcnQ+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKdGVtcGxhdGU8CiAgICB0eXBlbmFtZSBULCAKICAgIFQgbWluVmFsLCAKICAgIFQgbWF4VmFsLCAKICAgIHR5cGVuYW1lIENvbXBhcmUgPSBsZXNzPFQ+PgpjbGFzcyBSYW5nZWRWYWx7CnB1YmxpYzoKICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOwogICAgdXNpbmcgY29tcGFyZV90eXBlID0gQ29tcGFyZTsKICAgIHN0YXRpYyBjb25zdGV4cHIgdmFsdWVfdHlwZSBtaW4gPSBtaW5WYWw7CiAgICBzdGF0aWMgY29uc3RleHByIHZhbHVlX3R5cGUgbWF4ID0gbWF4VmFsOwogICAgc3RhdGljIGNvbnN0ZXhwciBjb21wYXJlX3R5cGUgY29tcGFyZSA9IGNvbXBhcmVfdHlwZSgpOwogCiAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgY2hlY2sodmFsdWVfdHlwZSB2YWwpewogICAgICAgIHJldHVybiBjb21wYXJlKG1pbiwgdmFsKSAmJiBjb21wYXJlKHZhbCwgbWF4KTsKICAgIH0KcHJpdmF0ZToKICAgIHZhbHVlX3R5cGUgdmFsdWU7CnB1YmxpYzoKICAgIGNvbnN0ZXhwciBSYW5nZWRWYWwodmFsdWVfdHlwZSB2YWwpOiB2YWx1ZShjaGVjayh2YWwpPyB2YWwgOiB0aHJvdyB2YWwpe30KCiAgICBjb25zdGV4cHIgb3BlcmF0b3IgdmFsdWVfdHlwZSgpIGNvbnN0ewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KfTsKIAppbnQgbWFpbigpIHsKICAgIFJhbmdlZFZhbDxpbnQsIDAsIDY+IHZhbCgzKTsKICAgIGNvdXQgPDwgdmFsIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQ==