Передача лямбда-выражений в качестве параметра в C ++ - PullRequest
0 голосов
/ 26 мая 2020

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

Но поскольку тестируемая функция должна получать дополнительные параметры, я подумал, что заполню параметры в теле лямбда-функции и передам их функции тестирования. (Я думаю, это называется каррированием?)

В любом случае я не могу заставить его скомпилировать:

main.cpp:43:62: error: invalid initialization of non-const reference of type ‘std::function<double*()>&’ from an rvalue of type ‘main(int, char**)::<lambda()>’
   bench::bench([=](){rng::gpu_r_exp((int) 10e6, lambda);}, 50);

Объявление функции выглядит так:

void bench(std::function<double*()>& funct_to_bench, int repeats);

и Я использую его так:

bench::bench([=](){rng::gpu_r_exp((int) 10e6, lambda);}, 50);

Поскольку компилятор снова спорит о non-const, я, возможно, должен добавить, что gpu_r_exp использует глобальную переменную, в которой хранится rngState (это также не понравилось неконстантные параметры в gpu_r_exp).

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

РЕДАКТИРОВАТЬ: Я должен добавить, что параметр с именем lambda - это двойное число, которое является параметром экспоненциального распределения и не имеет ничего общего с лямбда-функцией.

1 Ответ

1 голос
/ 27 мая 2020

Учитывая, что оболочка теста небольшая, не имеет смысла беспокоиться о том, что передается, или о том, можно ли его преобразовать в std::function. Просто возьмите то, что приходит, и пока это можно назвать, вы золотой:

template <typename Fun>
void benchmarkCallable(size_t iterations, Fun &&callable)
{
  //...
  while (iterations--)
    callable();
  //..
}

Если вы беспокоитесь, что разделы //... становятся громоздкими, вы можете разделить их на класс:

class ScopedBenchmark {
  // start time, other state needed, etc.
public:
  ScopedBenchmark() { /* capture initial state */ }
  ~ScopedBenchmark() { /* dump results etc */ }
};

template <typename Fun>
void benchmarkCallable(size_t iterations, Fun &&callable)
{
  ScopedBenchmark benchmark;
  while (iterations--)
    callable();
}

int main()
{
  benchmarkCallable(1'000'000, []{ printf("foo!\n"); });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...