在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中的一些方法,但我无法找到上述问题的解决方案。
第一
// 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
都是不同的类型。如果您要编写编译时循环或递归,则必须在向量为空时让它停止,但向量中的元素数量仅在运行时才知道。