2016-11-11 2 views
0

У меня есть функция, скажемПринимать как лямбда-функции и функции-указатели в качестве аргумента

void processSomething(Arg1 arg1, Function t){ 
    ... 
    t(someVariable); 
} 

Я хочу, чтобы оба из следующих использований работы:

processSomething(myArg1, [&](SomeVariable someVar){...}); 
void(*myFunc)(void) = &someFunc; 
processSomething(myArg1, myFunc); 

Однако, я обнаружил, что Я не могу использовать лямбда-путь при использовании void(*myFunc)(void) в качестве объявления параметра. Любой способ использовать оба режима работы без двух отдельных функций или чрезмерно сложного использования оберток?

+0

Если вы посмотрите на, например, [стандартные функции алгоритма] (http://en.cppreference.com/w/cpp/algorithm) вы увидите, что все функции, принимающие «предикат», будут иметь его как шаблонный тип. –

ответ

6

Ну, у вас есть два варианта:

  1. Шаблоны:

    template<class F> 
    void processSomething(Arg1 arg1, F t){ 
    

    Это предпочтительный способ, поскольку он создает более эффективный код, но за счет возможного кода дублирования.

  2. Использование std::function или такое:

    void processSomething(Arg1 arg1, std::function<void(SomeVariable)> t){ 
    

    Там есть среда, стоимость на indirections участие, но он будет использовать один и тот же код в каждом конкретном случае.

+0

Удивительно, большое спасибо. – user2065501

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