将列表传递给函数以充当 C++ 中的多个参数

问题描述 投票:0回答:1

在Python中,我们可以解压一个列表,将列表的元素作为参数传递给函数。我正在寻找 C++ 中的类似功能。

我有一个未知大小的列表和一个参数数量==列表大小的函数。我想解压这个列表并将元素作为参数传递给这个函数。以下是示例代码:

#include <cstdio>

void yourFunction(int a, int b, int c, int d, int e) {
    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);
    printf("%d\n", d);
    printf("%d\n", e);
}

int main() {
    int inputList[5] = {10, 20, 30, 40, 50}; // size of list can be unknown at compile time
    // Somehow pass this list to function as individual elements
}

我尝试了https://en.cppreference.com/w/cpp/language/parameter_pack中的一些方法,但我无法找到上述问题的解决方案。

c++ c++11 c++17 parameter-passing parameter-pack
1个回答
0
投票

第一

// size of list can be unknown at compile time

不。数组的大小必须是编译时常量。如果你想要一个

std::vector
,那就会变得更复杂。对于数组,您可以在这里阅读:如何从数组构造元组如何将数组转换为元组,然后使用
std::apply
调用函数:

#include <cstdio>
#include <tuple>
#include <array>


void yourFunction(int a, int b, int c, int d, int e) {
    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);
    printf("%d\n", d);
    printf("%d\n", e);
}


template <size_t N,size_t ...Is>
auto as_tuple(std::array<int, N> const& arr,
                                std::index_sequence<Is...>)
{
    return std::make_tuple(arr[Is]...);
}

template <size_t N>
auto as_tuple(std::array<int, N> const& arr)
{
    return as_tuple(arr, std::make_index_sequence<N>{});
}


int main() {
    std::array<int,5> inputList{10, 20, 30, 40, 50}; 
    std::apply(yourFunction,as_tuple(inputList));
}

现场演示

使用可以有任意数量参数的

std::vector
,您可以通过
std::bind_front
将向量的元素绑定到函数:

int main() {
    std::vector<int> inputList{10, 20, 30, 40, 50}; 
    auto f4 = std::bind_front(yourFunction,inputList[0]);
    auto f3 = std::bind_front(f4,inputList[1]);
    auto f2 = std::bind_front(f3,inputList[1]);
    auto f1 = std::bind_front(f2,inputList[1]);
    auto f0 = std::bind_front(f1,inputList[1]);
    f0();
}

无法以自动化方式执行此操作的原因是所有

fN
都是不同的类型。如果您要编写编译时循环或递归,则必须在向量为空时让它停止,但向量中的元素数量仅在运行时才知道。

© www.soinside.com 2019 - 2024. All rights reserved.