2016-11-15 4 views
0

У меня есть куча кода шаблона в отношении моих лямбдов. здесь является сыройПередача аргументов функции C++ в другую лямбда

На данный момент позволяет предположить, что MyClass выглядит следующим образом:

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

С его лямбдах присвоенных во время выполнения, как например:

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){}); 

Я просто хочу, чтобы передать параметры и убедитесь, что они совпадают.

Как обернуть это в функцию, Предполагая, что у меня будет неопределенное количество параметров и разных типов?

Спасибо!

+0

Является ли 'eventList'' карте '? Каков его тип? – Arunmu

+0

ах да плохой пример Я отредактирую. Я использую класс с определенными параметрами lambdas, такими как std :: function OnClick – Avalon

+0

Все еще не понятно. Что такое 'event'? Будет ли привязанная к событию лямбда всегда принимать 3 параметра, и меняется только внутренняя подпись функции? – Arunmu

ответ

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; 
    }; 
} 

Оригинальная функция дополняется дополнительными, она стирает предыдущие функции от оригинальной лямбда.

Вот пример использования:

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); 

Который должен напечатать в следующей последовательности:

вложенное событие!

Смежные вопросы