В этом коде есть 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;
}
То, что вы ищете, это 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]();
@RemyLebeau Вы технически правы (в лучшем случае правильно!), Но, с другой стороны, у большинства людей преувеличенное представление о std::function's
накладных расходах. Единственная действительно проблематичная часть по сравнению с необработанными указателями на функции - это sizeof
. Случай с OP — это одна из тех ситуаций, когда я думаю, что более четкое разделение проблем на фронте проектирования стоит того, чтобы использовать немного больше байтов памяти.
Я попробовал ваш код, но я сделал такую ошибку; нет экземпляра перегруженной функции "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 Обратите внимание, что в моем примере я передаю сам first_table
, а не результат вызова first_table()
, как вы сделали в своем вопросе. Это, скорее всего, ваша ошибка. В любом случае, уверяю вас, код в моем ответе отлично работает, как и на всех современных компиляторах.
вы правы из-за моей ошибки, это не сработало, но теперь код работает, большое спасибо :)))
Предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.