Is it possible to deduce a non-type template parameter from a template function parameter?
Consider this simple template:
template <int N> constexpr int factorial()
{
return N * factorial<N - 1>();
}
template <> constexpr int factorial<0>()
{
return 1;
}
template <> constexpr int factorial<1>()
{
return 1;
}
I would like to be able to change factorial
so that I can alternatively call it like this:
factorial(5);
and let the compiler figure out the value of N at compile time. Is this possible? Maybe with some fancy C++11 addition?
Your current code would normally be written as follows, I believe:
constexpr factorial (int n)
{
return n > 0 ? n * factorial( n - 1 ) : 1;
}
If you call it with a constant-expression, such as factorial(5)
, then all the compiler magic will come into play. But if you do int a = 3; factorial(a)
, then I think it will fall back on a conventional function - i.e. it won't have built a lookup table of pre-computed answers.
In general, you should mark every function and constructor as constexpr
if you can. You lose nothing, the compiler will treat it as a normal function if necessary.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With