Recursive lambda C++17
Recursive lambda C++17
我有以下情况,我有一个带有如下所示的函数的类:
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::<lambda_6d76c4236d9122e99fd2ab44986c7643>::operator ()': a function that returns 'auto' cannot be used before it is defined
您应该指定 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); });
}
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何在c++17中制作一个模板包装器/装饰器
- 可组合的lambda/std::函数与std::可选
- 枚举环境变量的惯用C++14/C++17方法
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- Recursive lambda C++17
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- 在C++17中,lambda是否可以作为模板参数传递
- 为什么 GCC 和 clang 之间编译的 c++17 lambda 存在差异?
- C++17 如何编写is_pointer_pointer泛型 lambda
- 在库中的 C++17 中强制内联回调 (lambda)
- C 17 Lambda捕获具有轻松型要求的Lambda
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- 在 c++-17 中特化的模式匹配中 lambda 的拆分函数签名
- C++17:lambda 到 std::函数转换失败
- 可以用参数包编译C 17 lambda继承的编译器