C ++将函数参数传递给另一个lambda

时间:2016-11-15 04:54:30

标签: c++ function lambda boilerplate type-deduction

我有一堆关于我的lambdas的样板代码。这是粗糙的

暂时假设myClass看起来像这样:

class myClass
{
   public:
    std::function<void(int,int)> event;
    std::function<void(std::string)> otherEvent;
    <many more std::function's with different types>
}

在运行时期间分配lambda:

myClass->event =[](T something,T something2,T something3)
{
    yetAnotherFunction(something,something,something3);
    //do something else.
} 

我希望它看起来像:

void attachFunction(T& source, T yetAnotherFunction)
{
    source = [](...)
    {
       yetAnotherFunction(...);
       //do something else.
    }
}

所以我可以这样打电话:

attachFunction(myClass->event,[](int a,int b){});

attachFunction(myClass->otherEvent,[](std::string something){});

我只是想传递参数并确保它们匹配。

如何将它包装成一个函数,假设我将有一个未定义的参数和不同类型的数量?

谢谢!

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题。这是我的解决方案:

template <typename R, typename... Args>
void attachEvent(std::function<R(Args...)>& original,std::function<R(Args...)> additional)
{
    original = [additional](Args... args)
    {
        additional(args...);
        std::cout << "Attached event!" << std::endl;
    };
}

原始函数通过附加扩展,它删除了原始lambda的先前功能。

以下是示例用法:

  std::function<void(float,float,float)> fn = [](float a ,float b,float c){};
  std::function<void(float,float,float)> additional = [](float a,float b,float c){std::cout << a << b << c << std::endl;};

  attachEvent(fn,additional);
  fn(2.0f,1.0f,2.0f);

哪个应按顺序打印:

212

附加活动!