#include <limits>
#include <string>
#include <iostream>
using namespace std;
template <typename T>
inline bool is_between(const string &str,
T min = numeric_limits<T>::min(),
T max = numeric_limits<T>::max()) noexcept
{
try {
long double value = stold(str);
if (value < min || value > max)
return false;
} catch (...) {
return false;
}
return true;
}
#include <iostream>
int main()
{
cout << boolalpha;
// UINT64_MAX -> true
cout << is_between<uint64_t>("18446744073709551615") << endl;
// UINT64_MAX + 1 -> false
cout << is_between<uint64_t>("18446744073709551616") << endl;
}
I2luY2x1ZGUgPGxpbWl0cz4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgppbmxpbmUgYm9vbCBpc19iZXR3ZWVuKGNvbnN0IHN0cmluZyAmc3RyLAogICAgICAgICAgICAgICAgICAgICAgIFQgbWluID0gbnVtZXJpY19saW1pdHM8VD46Om1pbigpLAogICAgICAgICAgICAgICAgICAgICAgIFQgbWF4ID0gbnVtZXJpY19saW1pdHM8VD46Om1heCgpKSBub2V4Y2VwdAp7CiAgICB0cnkgewogICAgICAgIGxvbmcgZG91YmxlIHZhbHVlID0gc3RvbGQoc3RyKTsKCiAgICAgICAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcmV0dXJuIHRydWU7Cn0KCiNpbmNsdWRlIDxpb3N0cmVhbT4KCmludCBtYWluKCkKewoJY291dCA8PCBib29sYWxwaGE7CgoJLy8gVUlOVDY0X01BWCAtPiB0cnVlCgljb3V0IDw8IGlzX2JldHdlZW48dWludDY0X3Q+KCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpIDw8IGVuZGw7CgoJLy8gVUlOVDY0X01BWCArIDEgLT4gZmFsc2UKCWNvdXQgPDwgaXNfYmV0d2Vlbjx1aW50NjRfdD4oIjE4NDQ2NzQ0MDczNzA5NTUxNjE2IikgPDwgZW5kbDsKfQ==