Как я могу получить доступ к std :: function в std :: list в C ++ - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь ответить на генерацию функции Template в C ++, которая принимает std :: list из std :: function (я думаю). Однако я не уверен, как понять тип данных, с которыми я работаю.

Согласно GDB мой тип данных:

type = std::__cxx11::list<std::function<void(std::array<positions, 3>&)>, std::allocator<std::function<void(std::array<positions, 3>&)> > > (*)(const std::array<positions, 3> &)

Я не могу получить доступ к элементу в виде массива, если я вызываю вход movenents Я не могу получить доступ, например, к первому элементу как movement[0] Я не понимаю, почему это так, поскольку тип выглядит как список.

Я пытался получить доступ к нему как к массиву, и я попытался прочитать std :: list, содержащий std :: function и получить к нему доступ с помощью:

for (auto f: movements) {
        (*f)();
    }

Функция, генерирующая список, выглядит следующим образом:

auto movements(const pieces_positions &pieces) {
    auto result = std::list<std::function<void(pieces_positions&)>>{};
    for (auto i=0u; i<pieces.size(); ++i)
        switch(pieces[i]) {
            case positions::pos1:
                result.push_back([i](pieces_positions& pieces){ pieces[i] = positions::pos2; });
                break;
            case positions::pos2:
                result.push_back([i](pieces_positions& pieces){ pieces[i] = positions::pos1; });
                result.push_back([i](pieces_positions& pieces){ pieces[i] = positions::pos3; });
                break;
            case positions::pos3:
                result.push_back([i](pieces_positions& pieces){ pieces[i] = positions::pos2; });
                break;
        }
    return result;
}

1 Ответ

3 голосов
/ 05 июня 2019

Две вещи (о которых я думаю, вы спрашиваете):

  1. Символ movements - это функция , которую нужно вызвать. Вы делаете это обычным movements(pices).

  2. Объекты функций в списке, которые возвращает функция, не являются указателями, на которые можно ссылаться. Вы используете их как обычные функции и вызываете их как таковые, например f(pieces).

Кроме того, в C ++ нет стандартного «списка массивов», такого как контейнер. Список является списком и не может быть проиндексирован как массив или вектор.

...