在C ++中用任何类型和数量的参数执行任何函数的函数

时间:2014-01-12 02:18:11

标签: c++ templates c++11

我目前有一个函数接受任何类型的向量和函数作为参数。传递的函数在执行时定时,并返回结果时间。使用传递的向量调用函数调用,但我想要做的是扩展调用,以便可以使用函数调用传递任意数量的参数,并且可以使用任意数量的参数调用它。该函数的代码如下所示,可在名为functions.h的文件中找到:

template<typename X, typename F>
double timer(std::vector<X> elements, F function) {
   clock_t tstart, tend;

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

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

函数mean只计算给定值的平均值(也在向量中)。 main.cpp文件包括对计时器的调用:

#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);

   double time = timer(x, mean<double>);
   std::cout << time << std::endl;

   return 0;
}

我不知道如何,但我相信它可能来自main的电话需要改变?也许是这样的:

double time = timer(mean<double(x)>);

或者

double time = timer(fakeFunction<double(x, y)>);

将计时器功能更新为以下内容:

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

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

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

非常感谢任何帮助或提示。

2 个答案:

答案 0 :(得分:2)

您可以使用std::bind将参数绑定到回调:

double time = timer(std::bind(mean<double>, x));

答案 1 :(得分:1)

您可以使用可变参数模板:

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

    tstart = clock();
    function(std::forward<ARGn>(argn)...);
    tend = clock();

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