【问题标题】:How can I access std::function in std::list in C++如何在 C++ 中的 std::list 中访问 std::function
【发布时间】:2019-06-05 10:50:06
【问题描述】:

我正在尝试回答在 C++ 中生成一个模板函数,该函数接受 std::function 的 std::list(我认为)。但是,我不确定如何理解我正在使用的数据类型。

根据 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 containing 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;
}

【问题讨论】:

  • 尝试简单的f();调用函数。
  • “我不能”是什么意思?到底是什么问题?

标签: c++ templates std-function stdlist


【解决方案1】:

两件事(我认为这是您要问的):

  1. 符号movements 是您需要调用的函数。你按照通常的movements(pices) 来做。

  2. 函数返回的列表中的函数对象不是可以取消引用的指针。您可以将它们用作普通函数并按原样调用它们,例如 f(pieces)

此外,在 C++ 中,没有像容器这样的标准“数组列表”。列表是一个列表,不能像数组或向量那样被索引。

【讨论】:

  • Nitpick: movements 有一个参数,所以会被称为movements(something)
猜你喜欢
  • 1970-01-01
  • 2020-05-06
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多