sum
с std::initializer_list
может быть сделано в C ++ 11 следующим образом:
template <typename It>
constexpr int sum(It it, It end)
{
return it == end ? 0 : (*it + sum(it + 1, end));
}
constexpr int sum(std::initializer_list<int> ini)
{
return sum(ini.begin(), ini.end());
}
static_assert(sum({1, 2, 3, 4, 5})== 15, "!");
Демо
C ++ 14 позволяет l oop в constexpr
функция, позволяющая избавиться от рекурсии:
constexpr int sum(std::initializer_list<int> ini)
{
int res = 0;
for (int e : ini) {
res += e;
}
return res;
}
А в C ++ 20 std::accumulate
помечается как constexpr, что позволяет
constexpr int sum(std::initializer_list<int> ini)
{
return accumulate(ini.begin(), ini.end(), 0);
}