Given a variable defined as
T x;
where T
is a generic arithmetic type (i.e. such that std::is_arithmetic<T>::value
), is there a simple expression (e.g something from std::numeric_limits
) that evaluates to the lowest value y
expressible in T
such that y
> x
?
(i.e. a kind of generalized increment..)
You can use std::nextafter
.
Note that here I use std::numeric_limits<Floating>::max()
, if you want meaningful behavior for infinities, you might want to modify the code.
#include <iostream>
#include <limits>
#include <cmath>
#include <type_traits>
#include <iomanip>
template <typename Floating,
std::enable_if_t<std::is_arithmetic_v<Floating> && !std::is_integral_v<Floating>, bool> = false>
Floating generic_next_val(Floating val) {
return std::nextafter(val, std::numeric_limits<Floating>::max());
}
template <typename Integral,
std::enable_if_t<std::is_arithmetic_v<Integral> && std::is_integral_v<Integral>, int> = 0>
Integral generic_next_val(Integral val) {
return static_cast<Integral>(val + static_cast<Integral>(1));
}
int main() {
int a = 1;
float f = 0.0f;
std::cout << std::setprecision(20) << generic_next_val(f) << " " << generic_next_val(a) << std::endl;
return 0;
}