C ++ - 模板函数接受绑定函数作为参数并将其传递给另一个函数

时间:2014-01-12 02:51:38

标签: c++ templates c++11

在回答上一个问题(A function to execute any function with any types and numbers of parameter in 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的一个问题,实际上并不是传递的函数调用。关于如何使用传递的函数调用生成工作的任何提示都将不胜感激。

1 个答案:

答案 0 :(得分:2)

std::generate收到的谓词需要返回一个值:

[&] { return timer(function); }
//    ^^^^^^