Как передать временный массив в функцию в стандарте C ++ 17 - PullRequest
0 голосов
/ 19 января 2020

У меня есть функция следующей подписи:

void foo(int argc, char const * const argv[]);

Я хотел бы назвать ее кратко, аналогично, но не обязательно, идентично, как показано ниже:

foo(3, {"one", "two", "three"});

Я знаю, что C поддерживает составные литералы только для этой цели ( ссылка ).

Я также знаю, как решить проблему с помощью шаблонов ( ссылка ).

Однако моя проблема немного другая. Сигнатура функции фиксирована - обычно она принимает аргументы, переданные в main, а размер массива не предопределен. Я пишу тесты для этой функции, и в моем случае переданные массивы известны во время компиляции.

Есть ли способ вызвать foo без использования временных переменных или функций-оболочек, как показано ниже?

char const * array[3] = {"one", "two", "three"};
foo(3, array);
template<int N>
void wrapper(char const * const (&array)[N])
{
    foo(N, array);
}

1 Ответ

1 голос
/ 20 января 2020

хотя я понятия не имею, как работает компилятор, он работает:

template<size_t N>
void foo(int argc, const char *(&&argv)[N]){
    int i=0;
    for( auto o: argv) {
        ++i;
        cout<<"array"<<i<<" = " << o<<"\n";
    }

    cout<< "\narray size "<<i<<"\n"<<argc<<"\n";
    return;
}

int main(){

    foo(3, {"one", "two", "three"});

}

array1 = one
array2 = two
array3 = three

array size 3
3
...