如何在C ++函数中传递数组元素作为参数?

时间:2017-01-28 13:52:20

标签: c++ arrays function parameters variadic-functions

我有这样的功能:

void foo(int count, ...)
{
  va_list args;
  va_start(args, count);
  // Do Somethings...
  va_end(args);
}

我想将数组元素作为参数传递给foo函数,如下所示:

void bar(int n, int array[])
{
  // I want to pass array elements as parameter like this:
  foo(n, array[0], array[1], array[2], array[3], ..... array[n]);
}

使用bar功能:

int main()
{
  bar(7, std::initializer_list<int>({ 0, 1, 2, 3, 4, 5, 6 }));

  return 0;
}

我该怎么办?谢谢!

1 个答案:

答案 0 :(得分:2)

如果你知道编译时的数组值是什么,你可以使用std::index_sequences和一些模板机制在C ++中做到这一点。
作为一个最小的工作示例:

#include<functional>
#include<iostream>

template<typename... Args>
void foo(std::size_t count, Args... args) {
    int _[] = { 0, (std::cout << args << std::endl, 0)... };
    (void)_;
}

template<std::size_t N, std::size_t... I, typename T>
void bar(std::index_sequence<I...>, T(&array)[N]) {
    foo(N, array[I]...);
}

template<std::size_t N, typename T>
void bar(T(&array)[N]) {
    bar(std::make_index_sequence<N>{}, array);
}

int main() {
    int array[] = { 0, 1, 2, 3, 4, 5, 6 };
    bar(array);
}

我认为array是一个数组而不是std::initializer_list。在这一点上,这个问题有点令人困惑。

请注意,以下代码也可以使用以下代码:

void foo(std::size_t count, ...) {
    va_list args;
    va_start(args, count);
    // do something...
    va_end(args);
}