Можно ли создать массив для функций?

Допустим, я хочу создать 10 функций с именем Function1, Function2 до 10. Каждая функция используется, если определенная переменная равна ее номеру. Вместо того чтобы использовать отдельные функции, мне было интересно, можно ли использовать какую-то концепцию массива для функций, когда дело доходит до именования? Я пробовал читать об этом и видел указатели, но, честно говоря, не понимал, что я видел об этом, потому что я еще не настолько хорошо разбираюсь в этом языке.

, 👍1

Обсуждение

Конечно, это возможно, вы можете сделать массив любого типа данных, который вам нравится. А указатель на функцию-это тип данных. Но это широкий вопрос, поэтому вы скорее получите хорошую книгу или онлайн-ресурс на C++ и начнете учиться., @the busybee


1 ответ


4

Вот пример того, как это сделать:

jump_table.ino

int func1(int arg)  { return arg + 1; }
int func2(int arg)  { return arg + 2; }
int func3(int arg)  { return arg + 3; }
int func4(int arg)  { return arg + 4; }
int func5(int arg)  { return arg + 5; }
int func6(int arg)  { return arg + 6; }
int func7(int arg)  { return arg + 7; }
int func8(int arg)  { return arg + 8; }
int func9(int arg)  { return arg + 9; }
int func10(int arg) { return arg + 10; }

int (*jump_table[10])(int) = { func1, func2, func3, func4, func5, 
                               func6, func7, func8, func9, func10 };
    
void setup() {
}
    
void loop() {
  int index = 2;
  int argument = 42;
  int result = (*jump_table[index])(argument);
  // результат - 45
}

Все функции, хранящиеся в массиве, должны иметь одинаковую сигнатуру. Это просто означает, что они должны возвращать один и тот же тип (например, int) и иметь одни и те же аргументы (один int в приведенном выше примере).


То же самое можно сделать и со статическими методами класса (но не с методами экземпляра). Например, вы можете использовать MyClass::myStaticMethod в приведенном выше массиве, но не MyClass::myInstanceMethod и не instance.myInstanceMethod:

class MyClass {
public:
  static int myStaticMethod(int foo)   { return foo + 17; }
  int        myInstanceMethod(int bar) { return bar + 17; }
}

MyClass instance;

Похожий вопрос есть и в stackoverflow.

,

Привет, разве аргумент отличается от аргумента arg? Но похоже, что ваш код верен., @AndroidV11

@AndroidV11 Значение argument передается соответствующей функции, где оно доступно как arg (или foo в примере класса). Кстати, судя по вашему комментарию, вы довольно новичок в программировании. Если это так, то я бы рекомендовал подробнее изучить основы C++, прежде чем использовать эту технику; она довольно продвинута и действительно имеет смысл использовать только в специализированных ситуациях (например, обработчики удаленных вызовов процедур)., @Alex Hajnal

@AndroidV11 Я только что исправил довольно неприятную опечатку в коде. C++ использует индексы массива на основе нуля, поэтому для вызова третьей функции "индекс" должен быть равен "2", а не "3"., @Alex Hajnal