C ++: Как передать функцию + аргументы в качестве параметра, не выполняя его? - PullRequest
1 голос
/ 28 апреля 2019

У меня есть 3 алгоритма функции:

void algo1(int para1, int para2);
void algo2(int para1, int para2);
void algo3(int para1, int para2);

и я хочу установить таймер для проверки эффективности этих функций

int get_execute_time( void(*f)(int para1, int para2) );

Я передаю функцию в качестве параметра на get_execute_time, чтобыво избежание изобилия, однако, проблема в том, что мне также нужно передать аргументы, которые para1, para2.

, поэтому я позволяю функции таймера измениться на

get_execute_time( void(*f)(int para1, int para2) , 
                 int para1, int para2) {
    (*f)(para1, para2); // call it
}

и,приведенный выше код кажется мне уродливым, , поэтому есть ли возможность обернуть код и позволить коду выполнить позже в C ++?

, чтобы я мог сделать так:

// definition
get_execute_time(this_code_will_execute_later) {
    this_code_will_execute_later();
};
// usage
get_execute_time(algo1(para1, para2));

Временное решение : использовать class для реализации closure-like (вдохновлено Есть ли у нас замыкания в C ++?

class timer {
private:
    int para1;
    int para2;
public:
    timer(int para1, int para2);
    operator () (void(*f)(int para1, int para2)) { (*f)(para1, para2) }
}
// thus we can write these following code
timer timer(para1, para2);
std::cout << "run " << timer(algo1) << " ms";
std::cout << "run " << timer(algo2) << " ms"
std::cout << "run " << timer(algo3) << " ms"

Итак, Существуют ли лучшие варианты? Спасибо в любом случае!

1 Ответ

2 голосов
/ 28 апреля 2019

Вы можете сделать это либо с std::bind, либо через лямбду. Например (для краткости показан только один параметр):

#include <iostream>
#include <functional>

void get_execute_time (std::function <void (void)> f)
{
    f ();
}

void foo (int i)
{
    std::cout << i << '\n';
}

int main()
{
    int param = 42;
    auto f1 = std::bind (foo, param);
    get_execute_time (f1);

    ++param;
    auto f2 = [param] { foo (param); };
    get_execute_time (f2);
}

Выход:

42
43

Живая демоверсия

...