The following example might seem nonsensical, but it's part of a larger high-performance code where the presented technique makes sense. I mention this just in case someone should suspect an XY question - it's most probably not.
I have a function with templated/compile-time operand:
template <int M> int mul(int x){ return M * x; } Now I want to do the same for double, what is - of course - not allowed:
template <double M> // you can't do that! int mul(double x){ return M * x; } So to still put in the double at compile time, I only see the following solution:
// create my constants struct SevenPointFive{ static constexpr double VAL = 7.5; } struct ThreePointOne{ static constexpr double VAL = 3.1; } // modified function template <class M> int mul(double x){ return M::VAL * x; } // call it double a = mul<SevenPointFive>(3.2); double b = mul<ThreePointOne>(a); Is there a better solution for the problem to somehow pass a double constant in a template parameter, without creating a struct for each value?
(I'm interested in a solution which actually uses double/float, not a hack with using two ints to create a rational number or fixed point ideas such as y = 0.01 * M * x.)
<size_t nom, size_t denom>for rational numbers, e.g..