簡體   English   中英

C++ lambda 傳遞自動參數類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM