Возможный дубликат:
C ++ возвращает массив из функции
Я пытаюсь объявить функцию, которая возвращает массив пустых указателей. У меня есть следующий код:
void *[] get_functions();
Однако я получаю ошибку компиляции: expected unqualified-id before '[' token
Является ли то, что я пытаюсь сделать, действительным, и если да, то какова моя синтаксическая ошибка?
РЕДАКТИРОВАТЬ
В ответ на некоторые комментарии я пытаюсь вернуть массив (который теперь, вероятно, будет вектором) функций, который я затем могу произвольно выбрать и вызвать. Что бы вы предложили вместо void *
?
РЕДАКТИРОВАТЬ 2
Тип возвращаемых функций будет иметь фиксированную подпись (пока не определено). Давайте для аргументов скажем, что подпись будет int f (int i, int j), что будет возвращением моего get_functions
функция выглядит или будет vector<void*>
все еще подойдет?
Есть два вопроса с вашим подходом. Во-первых, вы не можете возвращать массивы из функций. В C вы бы возвращали указатель на элементы в массиве, но это означает, что вам нужно управлять памятью. В C ++ вы можете использовать контейнер, как std::vector
вместо массива, и это может быть возвращено по значению.
Вторая проблема заключается в том, что вы возвращаете указатели на функции, и преобразование из указателя функции в void*
не гарантируется стандартом. Здесь альтернативы начинаются с возврата указателя на функцию соответствующего типа (т.е. std::vector<int (*)(int,int)>
) или используя конструкции более высокого уровня, такие как std::function
(C ++ 11 или boost::function
в C ++ 03): std::vector<std::function<int(int,int)>>
, Первый подход лучше подходит для описания, которое вы предоставили, так как типы функций кажутся фиксированными, и использование указателей на функции будет незначительным. Второй подход является более общим, поскольку он может инкапсулировать все, что можно вызвать с двумя int
и вернуть int
, включая указатели функций и функциональные объекты. Это, в свою очередь, позволяет адаптировать сигнатуры других функций с помощью std::bind
или создайте лямбды с соответствующей подписью: [](int x, int y){ return x*y;}
C ++ не позволяет функции возвращать массив. Вы, вероятно, должны вернуть вектор вместо:
std::vector<void *> get_functions();
void **get_functions();
Позже вы можете сказать:
void **pp = get_functions();
pp[5]; // This is the sixth pointer-to-void
Если вы еще не знаете длину массива, вам нужно будет передать его другим способом — по этой причине ответ Джерри Коффина, вероятно, лучше.
Вы можете просто вернуть пустой указатель на первый элемент массива. и вы можете разыграть его внутри вызывающей функции.
сам массив передается / возвращается как указатель.