gpt4 book ai didi

c++11 - 将 std::vector 扩展到参数包中

转载 作者:行者123 更新时间:2023-12-05 02:58:46 24 4
gpt4 key购买 nike

我有具有以下签名的方法:

void DoStuff(int i);
void DoStuff(int i, k);
void DoStuff(int i, int k, int l);

我有一个方法,我想按如下方式调用 DoStuff 方法:

void CallDoStuff(const std::vector<int>& vElements) {
// What magic is supposed to happen here to make vElements an expandable pack?
DoStuff(vElemets...);
}

有机会实现吗?使用 std::index_sequence 的方式是否正确?如果是,能否请您提供一个简单示例,说明如何将其应用于我的问题?

最佳答案

问题是,从 std::vector,您不能 -- compile time -- 提取 size() 值。

因此,只有当您将要从向量中使用的元素数量作为编译时已知值传递给 CallDoStuff() 时,您才能获得所需的内容。

例如,您可以将其作为模板值传递。

使用辅助函数,您可以编写如下内容

template <std::size_t ... Is>
void CallDoStuff (std::vector<int> const & vElements,
std::index_sequence<Is...> const &)
{ DoStuff(vElements[Is]...); }

template <std::size_t N>
void CallDoStuff (std::vector<int> const & vElements)
{ CallDoStuff(vElements, std::make_index_sequence<N>{}); }

调用可以是这样的

CallDoStuff<5u>(v);

如果你可以使用 std::array,而不是 std::vector,答案就不同了:你可以提取 size() 来自类型本身,所以

template <std::size_t N, std::size_t ... Is>
void CallDoStuff (std::array<int, N> const & vElements,
std::index_sequence<Is...> const &)
{ DoStuff(vElements[Is]...); }

template <std::size_t N>
void CallDoStuff (std::array<int, N> const & vElements)
{ CallDoStuff(vElements, std::make_index_sequence<N>{}); }

无需说明 N 即可调用,如下所示

std::array<int, 5u>  arr { 2, 3, 5, 7, 11 };

CallDoStuff(arr); // no more <5u>

尾注:注意 std::make_index_sequencestd::index_sequence 仅从 C++14 开始可用。在 C++11 中,您必须以某种方式替换它们。

关于c++11 - 将 std::vector 扩展到参数包中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58633925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com