Хотя float
s нельзя использовать в качестве параметров шаблона, float const&
s можно.Таким образом, вы можете передать min
и max
в качестве параметров шаблона:
template <typename real_t, real_t const& min, real_t const& max, typename counts_t>
real_t counts2real(counts_t c)
{
constexpr real_t cmin = std::numeric_limits<counts_t>::min();
constexpr real_t cmax = std::numeric_limits<counts_t>::max();
constexpr real_t cdelta = (cmax - cmin);
static_assert(max > min, "max > min");
real_t delta = (max - min);
real_t p = (c - cmin) / cdelta;
return (p * delta + min);
}
Использование:
constexpr float min = 10.0;
constexpr float max = 50.0;
float foo(int16_t x) {
return counts2real<float, min, max>(x);
}
Изменение max
на 5.0
приводит к необходимой диагностике:
<source>:13:21: error: static assertion failed: max > min
static_assert(max > min, "max > min");
Демо
В C ++ 17 вы можете избежать необходимости указывать тип min
и max
:
template <auto const& min, auto const& max, typename counts_t>
constexpr auto counts2real(counts_t c)
{
...
}
// ...
float foo(int16_t x) {
return counts2real<min, max>(x);
}