[英]c++ lambda pass around auto parameter type
我有一個帶有自動參數的 lambda 函數,我想將參數推送到 STL 容器中(例如 std::vector)
例如:
template <typename T>
struct A
{
A(int a, T &&t): _a(a), _t(t){}
int _a;
T _t;
void work()
{
_t(this);
}
};
void test()
{
A a(3, [](auto a_ptr)
{
std::cout << a_ptr->_a << std::endl;
});
a.work();
}
這個例子工作得很好。
但是,如果我想保存 a_ptr 以供以后在向量中使用,我不知道在向量模板參數中寫什么。
我認為我什至不能在 lambda 的參數類型中使用 std::function 而不是 auto ,因為我認為 A 的類型是遞歸的(T 是接受 T 中的 a 的 lambda ......)
無論如何,這就是我想解決它的方式,但想知道是否有更好的解決方案:
struct base_a
{
virtual void work() = 0;
};
template <typename T>
struct A : public base_a
{
A(int a, T &&t): _a(a), _t(t){}
int _a;
T _t;
virtual void work() override
{
_t(this);
}
};
void test()
{
std::vector<base_a *> v;
A a(3, [&v](auto a_ptr)
{
v.push_back(a_ptr);
std::cout << a_ptr->_a << std::endl;
});
a.work();
for (auto i: v)
{
i->work();
}
}
是否有解決此問題的已知設計模式?
將 lambda 轉換為不帶參數的 std::function(捕獲您需要的參數)。
void execute_functions(const std::vector<std::function<void()>>& functions) {
for (const auto& item : functions) {
item();
}
}
int main(int argc, char** argv) {
// declare
std::vector<std::function<void()>> functions;
// populate
for (int i = 0; i < 3; ++i) {
functions.emplace_back([i](){ // < - capture data to process here
// do something wth data when will be called
std::cout << i << "\n";
});
}
// execute somewhere
execute_functions(functions);
return 0;
}
示例在這里
我可以在 lambda 中創建一個新的 lambda 來捕獲所有參數,然后將其放入一個向量中:
void test()
{
std::vector<std::function <void ()>> v;
A a(3, [&v](auto a_ptr)
{
v.push_back([a_ptr](){
std::cout << a_ptr->_a << std::endl;
});
});
a.work();
for (auto &i: v)
{
i();
}
}
但我認為從用戶的角度(編寫 test() 函數的人),繼承方法更容易,因為他可能希望保留多個 lambda 來處理不同的情況。
這會使程序流程不必要地復雜 IMO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.