c++ - 遍历std::initializer_list

标签 c++ c++11 metaprogramming initializer-list parameter-pack

//parameter pack sum example

constexpr int sum(int N= 0)
{
    return N;
}
template<typename ...Args>
constexpr int sum(int first, int second, Args ...N)
{
    return first + second + sum(N...);
}

int main()
{
    std::cout << sum<int>(1,6,3);
}

是否可以使用std::initializer_list<int>在编译时求和,我如何通过它进行递归迭代。

最佳答案

在C++ 11中,可以通过以下方式将sumstd::initializer_list结合使用:

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, "!");

Demo

C++ 14允许在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);
}

关于c++ - 遍历std::initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60429994/

相关文章:

c++ - 指向类成员函数的指针作为外部函数的参数

c++ - 如何实现 is_enum_class 类型特征?

ruby - 为什么这个绑定(bind)不起作用

c++ - 获取与 map 中的查询匹配的所有键

c++ - 在 C++ 中,是否可以在构造函数中访问静态变量?

C++ 11x 检查 : how to implement const-variants?

c++ - int&& 和 template<class T> T&& 的区别

c++ - 当用字符串文字实例化时,模板 T & 参数到底是什么?

c++ - 使用 boost::random 从要删除元素的 std::list 中进行选择

c++ - 是否可以重新路由 lambda 以将其包装在包装类中?