передача массива функций по ссылке C

#c #arrays #pointers

#c #массивы #указатели

Вопрос:

В файле (скажем, file1.h) содержится несколько функций. Эти функции похожи по своему определению и возвращаемому значению. Сам файл, изменять его не разрешается. Я хочу упростить их следующим образом:

файл1.h

 int func1 (void)
{
    return 11;
}
int func2(void)
{
    return 12;
}
int func3(void)
{
    return 13;
}
 

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

source_file.cpp

 static int func_main(const int idx, int* arr_of_func)
{
    int ret = 0;
    switch (idx)
    {
        case 1:
            ret = arr_of_func[0];
            break;
        case 2:
            ret = arr_of_func[1];
            break;
        case 3:
            ret = arr_of_func[0];
            break;
        default:
            ret = -1;
            break;
    }

    return ret;
}

int main()
{
    std::cout << "Hello World!n";
    int x = 0;
    cin >> x;
    int (*arr[3])(void) = {func1, func2, func3};

    cout << func_main(x, *arr);
    system("pause");
}
 

Путем вызова функции func_main(x, *arr) Я не знаю, как передать массив (второй аргумент). Мне нужна ваша помощь, пожалуйста. Спасибо.

Комментарии:

1. Ну, int* это, конечно, не ссылка на массив функций. Вы рассматривали возможность изменения этого? Кроме того, если вы хотите передать ссылку a на массив, то почему вы используете оператор косвенного обращения к нему?

2. да, вы абсолютно правы, функция (func_main()) Я хочу его создать, поэтому я не знаю, как должен передаваться второй параметр, либо по ссылке, либо по указателю.

Ответ №1:

Исправьте func_main параметр int* arr_of_func для массива указателей на функции int (*arr_of_func[3])() . По умолчанию массивы передаются по ссылке.

 #include <string>
#include <functional>
#include <iostream>

int func1 (void)
{
    return 11;
}
int func2(void)
{
    return 12;
}
int func3(void)
{
    return 13;
}

static int func_main(const int idx, int (*arr_of_func[3])())
{
    int ret = 0;
    switch (idx)
    {
        case 1:
            ret = arr_of_func[0]();
            break;
        case 2:
            ret = arr_of_func[1]();
            break;
        case 3:
            ret = arr_of_func[2]();
            break;
        default:
            ret = -1;
            break;
    }

    return ret;
}

int main()
{
    std::cout << "Hello World!n";
    int x = 0;
    std::cin >> x;
    int (*arr[3])(void) = {func1, func2, func3};

    std::cout << func_main(x, arr);
    system("pause");
}
 

Комментарии:

1.С C 11 вы также можете использовать std::function en.cppreference.com/w/cpp/utility/functional/function