Подать массив в функцию

135
09 января 2020, 08:20

Есть необходимость воспользоваться некоторой функцией. Например:

void foo (int * arr) {
    (void) arr;
}

Если вызывать её, скажем, так:

int arr [] = {1, 2};
foo (arr);

то компиляция проходит успешно. Если же написать подобный код:

foo ({1, 2});

то компилятор выдаст предупреждение error: cannot convert '<brace-enclosed initializer list>' to 'int*' for argument '1' to 'void foo(int*)'. Хотелось в подобном (foo ({1, 2})) синтаксисе вызывать функции от массивов, так как, говоря об области применения, хочется задать подобный массив через директиву #define и использовать, как константу.

Answer 1

Фактически, вы передаете в функцию временный массив.

В этом случае, вы можете объявить функцию. как шаблонную функцию следующего вида, как это показано в демонстрационной программе ниже.

#include <iostream>
#define List1 { 1 }
#define List2 { 1, 2 }
template <size_t N>
void f( const int ( &a )[N] )
{
    for ( const auto &item : a ) std::cout << item << ' ';
    std::cout << '\n';
}
int main( void )
{
    f( List1 );
    f( List2 );
}

Вывод на консоль:

1 
1 2 
Answer 2

{}-список в С++ сам по себе не является выражением, и в контексте инициализации указателя {}-список не будет расцениваться как инициализатор для массива. Сделать из него временный массив в таком контексте вы можете только явно

  using A = int [];
  A{ 1, 2 }

Получаем

void foo(int *arr) 
{
}
int main()
{
  using A = int [];
  foo(A{ 1, 2 });
}

Замечание: баг в gcc может не позволить вам так неявно получить указатель на временный массив. Тогда foo((int *) A{ 1, 2 }).

Но возможно лучше пойти по пути Передача массива в функцию не обьявляя его

READ ALSO
Можно в qml передать QMap?

Можно в qml передать QMap?

Я нашёл как передавать из qt в qml QAbstractListModelНо не нашёл как передать QMap

127
Конвертация Python str в QString с использованием boost.python

Конвертация Python str в QString с использованием boost.python

Столкнулся с проблемой написания конвертера из Python str в QString с использованием boostpython

128
Кто знает как пофиксить? [закрыт]

Кто знает как пофиксить? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

130
Как работает boost::geometry::model::ring

Как работает boost::geometry::model::ring

Почему ring в виде восьмигранника оказывается не валиден:

144