【问题标题】:Recursive lambda C++17递归 lambda C++17
【发布时间】:2020-05-24 10:09:41
【问题描述】:

我有以下情况,我有一个函数看起来像这样的类:

void GetTest(int id, std::function<void(Test)> cb);
void GetTest2(long id, std::function(void(Test2)> cb);

cb方法会在方法完成后调用,会在后台运行,CB方法的执行顺序不保证。

现在我遇到了需要获取 ID 向量的情况。所以我尝试编写一个模板函数来 调用这些方法并在查询完所有 ID 后调用回调。

我想出了以下方法:

template <typename T, typename T2>
void QueryList(std::vector<T2> list, std::function<void(std::shared_ptr<std::vector<T>>)> finalCallback) {
    std::shared_ptr<std::vector<T>> ret = std::make_shared<std::vector<T>>();

    auto callback = [this, list, ret, finalCallback](size_t i, auto callback, T res) {
        ret->push_back(res);

        if (i + 1 < list.size()) {
            GetTest(list[i + 1], [callback, i](T test) { callback(i + 1, callback, test); });
        } else {
            finalCallback(ret);
        }
    };

    GetTest(list[0], [callback](T test) { callback(0, callback, test); });
}

但这会导致以下错误error C3779: 'QueryList::&lt;lambda_6d76c4236d9122e99fd2ab44986c7643&gt;::operator ()': a function that returns 'auto' cannot be used before it is defined

【问题讨论】:

标签: c++ asynchronous recursion lambda c++17


【解决方案1】:

你应该指定 lambda 的返回类型:

template <typename T, typename T2>
void QueryList(std::vector<T2> list, std::function<void(std::shared_ptr<std::vector<T>>)> finalCallback) {
    std::shared_ptr<std::vector<T>> ret = std::make_shared<std::vector<T>>();

    auto callback = [this, list, ret, finalCallback](size_t i, auto callback, T res) -> void {
//                                                                                   ^^^^^^^
        ret->push_back(res);

        if (i + 1 < list.size()) {
            GetTest(list[i + 1], [callback, i](T test) { callback(i + 1, callback, test); });
        } else {
            finalCallback(ret);
        }
    };

    GetTest(list[0], [callback](T test) { callback(0, callback, test); });
}

【讨论】:

  • 有时.. 浪费了 4 个小时犯错并且只是失明后,最好先睡觉。谢谢!
猜你喜欢
  • 2015-01-17
  • 2017-05-28
  • 1970-01-01
  • 2013-08-07
  • 2011-01-05
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多