В ответ на предыдущий вопрос (Функция для выполнения любой функции с любыми типами и номерами параметров в C ++) Я обнаружил, что могу использовать метод std :: bind для привязки параметров при передаче функции в качестве аргумента другой функции. Как мне передать его другой функции? Код промежуточной функции (repeatFunction) и таймера показаны ниже:

template<typename F>
double timer(F function) {
   clock_t tstart, tend;

   tstart = clock();
   function();
   tend = clock();

   return ((double)tend - tstart) / CLOCKS_PER_SEC;
}

template<typename F>
std::vector<double> repeatFunction(F function) {
   std::vector<clock_t> numCalls(9);
   std::vector<double> info;

   std::generate(numCalls.begin(), numCalls.end(), [&](){ timer(function); });
   info.push_back(mean(numCalls));
   info.push_back(standardDeviation(numCalls));
   return info;
}

Код берет переданную функцию и запускает ее несколько раз и, в свою очередь, возвращает время, которое потребовалось для выполнения функции. Функция (функция F) связана с main, как показано ниже:

#include <cstdlib>
#include <algorithm>
#include <numeric>
#include <vector>
#include <cmath>
#include <ctime>
#include <iostream>
#include "functions.h"

int main(void) {
   std::vector<double> x;
   x.push_back(53.0);
   x.push_back(61.0);
   x.push_back(49.0);
   x.push_back(67.0);
   x.push_back(55.0);
   x.push_back(63.0);

   std::vector<double> info = repeatFunction(std::bind(mean<double>, x));

   return 0;
}

Нужно ли мне каким-то образом получать параметры, а затем повторно связывать их в функции repeatFunction?

РЕДАКТИРОВАТЬ: На самом деле это проблема с std :: generate, а не с переданным вызовом функции. Любые советы о том, как заставить генерировать работу с переданным вызовом функции, будут оценены.

0
Josh Davis 12 Янв 2014 в 06:51
Какую ошибку вы получаете?
 – 
0x499602D2
12 Янв 2014 в 07:10
В файле, включенном из /usr/include/c++/4.7/algorithm:63:0, из main.cpp: 2: /usr/include/c++/4.7/bits/stl_algo.h: В экземпляре 'void std :: generate (_FIter, _FIter, _Generator) [с _FIter = __gnu_cxx :: __ normal_iterator >; _Generator = repeatFunction (F) [with F = std :: _ Bind )) (std :: vector )>] :: ] ': функции .h: 50: 4: требуется от 'std :: vector repeatFunction (F) [с F = std :: _ Bind )) (std :: vector )>] '
 – 
Josh Davis
12 Янв 2014 в 07:14
Main.cpp: 29: 72: требуется отсюда /usr/include/c++/4.7/bits/stl_algo.h:5083:2: ошибка: значение void не игнорируется, как должно быть
 – 
Josh Davis
12 Янв 2014 в 07:15

1 ответ

Лучший ответ

Предикат, который получает std::generate, должен возвращать значение:

[&] { return timer(function); }
//    ^^^^^^
2
0x499602D2 12 Янв 2014 в 19:56
Вау, думаю, я слишком долго смотрел на это. В очередной раз благодарим за помощь.
 – 
Josh Davis
12 Янв 2014 в 07:19