C ++ возвращает массив пустых указателей

Возможный дубликат:
C ++ возвращает массив из функции

Я пытаюсь объявить функцию, которая возвращает массив пустых указателей. У меня есть следующий код:

void *[] get_functions();

Однако я получаю ошибку компиляции: expected unqualified-id before '[' token

Является ли то, что я пытаюсь сделать, действительным, и если да, то какова моя синтаксическая ошибка?

РЕДАКТИРОВАТЬ
В ответ на некоторые комментарии я пытаюсь вернуть массив (который теперь, вероятно, будет вектором) функций, который я затем могу произвольно выбрать и вызвать. Что бы вы предложили вместо void *?

РЕДАКТИРОВАТЬ 2
Тип возвращаемых функций будет иметь фиксированную подпись (пока не определено). Давайте для аргументов скажем, что подпись будет int f (int i, int j), что будет возвращением моего get_functions функция выглядит или будет vector<void*> все еще подойдет?

1

Решение

Есть два вопроса с вашим подходом. Во-первых, вы не можете возвращать массивы из функций. В 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;}

2

Другие решения

C ++ не позволяет функции возвращать массив. Вы, вероятно, должны вернуть вектор вместо:

std::vector<void *> get_functions();
7

void **get_functions();

Позже вы можете сказать:

void **pp = get_functions();
pp[5];     // This is the sixth pointer-to-void

Если вы еще не знаете длину массива, вам нужно будет передать его другим способом — по этой причине ответ Джерри Коффина, вероятно, лучше.

1

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

0
По вопросам рекламы [email protected]