C++ c++;lambda传递自动参数类型

C++ c++;lambda传递自动参数类型,c++,lambda,auto,C++,Lambda,Auto,我有一个带有自动参数的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)

我有一个带有自动参数的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
{
A(inta,T&&T):\u A(A),\u T(T){
国际组织;
T_T,;
无效工作()
{
_t(这个);
}
};
无效测试()
{
A(3,[](自动A_ptr)
{

std::cout\u a将lambda转换为不带参数的std::function(捕获您需要的参数)

void执行函数(const std::vector&functions){
用于(常量自动和项目:功能){
项目();
}
}
int main(int argc,字符**argv){
//申报
向量函数;
//填充
对于(int i=0;i<3;++i){
functions.emplace_back([i](){/<-捕获要在此处处理的数据
//在调用时使用数据执行某些操作

std::cout我可以在lambda中创建一个新的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();
    }
}
void测试()
{
std::向量v;
A(3,[&v](自动A_ptr)
{
v、 推回{

std::cout\a向量必须具有相同类型的所有项。lambda没有已知的类型。如果可能,请使用std::tuple,而不是多态调用work,这样您将需要一个向量或向量,我将避免使用原始指针,特别是当您拥有您的项时。@doron,您是对的。在我的实际代码中,我使用共享指针。此代码这只是一个简化的示例。我无法捕获参数。lambda用作回调函数。我猜示例中不清楚,但在我的实际应用程序中,lambda由其他类/方法转发到调用类
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;
}
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();
    }
}