Могу ли я добавить другую функцию, определенную в моем коде, в вектор, такой как массивы, которые включают адрес функции?

В этом коде есть 6 различных функций. Они создают 6 разных досок для игры. Но я не хочу создавать доски с if условиями, я хочу создать vector, который включает в себя адреса функций. Например, если пользователь хочет создать доску 4 для игры, я хочу создать доску следующим образом:

vector<vector<cell>> a = function_array[3];

cell — это тип enum, который я объявил.

Могу ли я это сделать, и может ли кто-нибудь помочь мне в этом?

vector<vector<cell>> first_table();
vector<vector<cell>> second_table();
vector<vector<cell>> third_table();
vector<vector<cell>> fourth_table();
vector<vector<cell>> fifth_table();
vector<vector<cell>> sixth_table();
    
int main()
{
    int chose,board_type;
    vector<vector<vector<cell>>> functions;

    functions.push_back(first_table());
    functions.push_back(second_table());
    functions.push_back(third_table()); //in here I create all boards and print which one the user wants
    functions.push_back(fourth_table()); //but I don't want to do this, I want just create the board the user wants
    functions.push_back(fifth_table());
    functions.push_back(sixth_table());

    vector<vector<cell>> b = functions[board_type-1];
    print_game(b);
    b = functions[0];
    cout << "welcomw Game" << endl;
    cout << "Please chose board type" << endl;
    cin >> board_type;
    int game_type;
    cout << "1.Personal game " << endl << "Computer game" << endl;
    cin >> game_type;
    string input;
    cout << "Please enter move direction" << endl;
    cin >> input;
}

Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Community 16.05.2022 23:02
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
1
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы ищете, это std::function

В вашем случае вы бы создали вектор std::function<> для функций, которые не принимают параметров и возвращают vector<vector<cell>>.

#include <functional>
#include <vector>

struct cell {};

//type aliases make code a lot more readable!
using board = std::vector<std::vector<cell>>;

board first_table();
board second_table();
board third_table();
board fourth_table();
board fifth_table();
board sixth_table();

int main() {
  std::vector<std::function<board()>> functions;

  functions.push_back(first_table);
  // etc...

  board b = functions[board_type-1]();
}

Вам это точно не нужно std::function. У него есть накладные расходы, которые не нужны для этого варианта использования. Поскольку все функции имеют одинаковую сигнатуру, будет достаточно простых указателей на функции, например: using board = vector<vector<cell>>; using board_func = board (*)(); ... board first_table(); ... std::vector<board_func> functions{ &first_table, ... }; ... board b = functions[index]();

Remy Lebeau 17.05.2022 02:45

@RemyLebeau Вы технически правы (в лучшем случае правильно!), Но, с другой стороны, у большинства людей преувеличенное представление о std::function's накладных расходах. Единственная действительно проблематичная часть по сравнению с необработанными указателями на функции - это sizeof. Случай с OP — это одна из тех ситуаций, когда я думаю, что более четкое разделение проблем на фронте проектирования стоит того, чтобы использовать немного больше байтов памяти.

Frank 17.05.2022 03:14

Я попробовал ваш код, но я сделал такую ​​​​ошибку; нет экземпляра перегруженной функции "std::vector<_Ty, _Alloc>::push_back [с _Ty=std::function<board ()>, _Alloc=std::allocator<std::function<board ()>>] " соответствует списку аргументовC/C++(304) main.cpp(30, 12): типы аргументов: (board ()) main.cpp(30, 12): тип объекта: std::vector<std::function <board ()>, std::allocator<std::function<board ()>>>

goOdyaga 17.05.2022 08:28

@goOdyaga Обратите внимание, что в моем примере я передаю сам first_table, а не результат вызова first_table(), как вы сделали в своем вопросе. Это, скорее всего, ваша ошибка. В любом случае, уверяю вас, код в моем ответе отлично работает, как и на всех современных компиляторах.

Frank 17.05.2022 08:32

вы правы из-за моей ошибки, это не сработало, но теперь код работает, большое спасибо :)))

goOdyaga 17.05.2022 08:43

Другие вопросы по теме