Функция Variadic, которая принимает типы массивов - PullRequest
0 голосов
/ 28 февраля 2019

Есть ли способ написать переменную функцию, которая принимает типы массивов?

void compare(int count ...) {
    double[2] condition;
    va_list vl;    
    va_start(vl, count);
    for (int i = 0; i < count; i++){
        condition = va_arg(vl, double[2]);
        // do something with condition
    }
    va_end(vl);
}

Я пытался сделать это на C ++, но моя программа говорит, что double[2] типы не могут быть назначены.

Есть ли решение?

1 Ответ

0 голосов
/ 28 февраля 2019

Исправлено затухание массивов в указатель на 1-й элемент.

Массивы всегда передаются в переменные параметры стиля C указателем, например:

void compare(int count, ...)
{
    double *condition;
    va_list vl;    
    va_start(vl, count);
    for (int i = 0; i < count; ++i)
    {
        condition = va_arg(vl, double*);
        // do something with condition up to 2 elements
    }
    va_end(vl);
}

int main()
{
    double arr1[2] = {1, 2};
    double arr2[2] = {3, 4};
    double arr3[2] = {5, 6};
    compare(3, arr1, arr2, arr3);
    return 0;
}

Если вам нужно знать длинуиз каждого переданного массива вы должны будете передать эту информацию, используя дополнительные переменные параметры, например:

void compare(int count, ...)
{
    double *condition;
    int len;
    va_list vl;    
    va_start(vl, count);
    for (int i = 0; i < count; ++i)
    {
        len = va_arg(vl, int);
        condition = va_arg(vl, double*);
        // do something with condition, up to len elements
    }
    va_end(vl);
}

int main()
{
    double arr1[1] = {1};
    double arr2[5] = {2, 3, 4, 5, 6};
    double arr3[2] = {7, 8};
    compare(3, 1, arr1, 5, arr2, 2, arr3);
    return 0;
}

Если вы используете C ++ 11 или более позднюю версию, вы должны использовать стиль C ++ variadic templates вместо переменных в стиле C, например:

template <size_t N>
void doSomething(double (&condition)[N])
{
    // do something with condition, up to N elements
}

template <size_t N>
void compare(double (&arr)[N])
{
    doSomething(arr);
}

template <size_t N, typename... Args>
void compare(double (&arr)[N], Args&... args)
{
    doSomething(arr);
    compare(args...);
}

int main()
{
    double arr1[1] = {1};
    double arr2[5] = {2, 3, 4, 5, 6};
    double arr3[2] = {7, 8};
    compare(arr1, arr2, arr3);
    return 0;
}

Live Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...