[英]Recursive lambda C++17
我有以下情況,我有一個 class,其功能如下所示:
void GetTest(int id, std::function<void(Test)> cb);
void GetTest2(long id, std::function(void(Test2)> cb);
cb 方法將在方法完成后調用,該方法將在后台運行,CB 方法的執行順序不保證。
現在我遇到了需要獲取 ID 向量的情況。 於是我嘗試寫了一個模板function來調用這些方法,並在查詢完所有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); });
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.