How to use if constexpr in template fold expressions?
As we do not have a ternary constexpr
operator, we can use a lambda instead.
#include <type_traits>
template<typename... T>
constexpr auto fold_sum(T... s){
return (... + [](auto x)
{
if constexpr(std::is_arithmetic_v<T>) return x;
else return 0;
}(s));
}
Usage:
int main()
{
static_assert(fold_sum(0, nullptr, 5, nullptr, 11, nullptr) == 16);
}
live example on godbolt.org
You absolutely want to use if constexpr
?
I propose a different alternative: std::get()
and std::pair
to simulate a constexpr
ternary operator as follows (with a Vittorio Romeo's improvement; thanks)
#include <utility>
#include <type_traits>
template<typename ... Ts>
constexpr auto fold_sum (Ts const & ... s)
{ return (... + std::get<std::is_arithmetic_v<Ts>>(std::pair{0, s})); }
int main ()
{
static_assert(fold_sum(0, nullptr, 5, nullptr, 11, nullptr) == 16);
}