【问题标题】:A function to execute any function with any types and numbers of parameter in C++在 C++ 中执行具有任何类型和数量的参数的任何函数的函数
【发布时间】:2014-01-12 02:18:10
【问题描述】:

我目前有一个函数,它接受任何类型的向量和一个函数作为参数。传递的函数在执行时计时,并返回结果时间。使用传递的向量调用函数调用,但我想做的是扩展调用,以便函数调用可以传递任意数量的参数,并且可以使用任意数量的参数调用它。该函数的代码如下,可在名为 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;
}

任何帮助或提示将不胜感激。

【问题讨论】:

    标签: c++ templates c++11


    【解决方案1】:

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

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

    【讨论】:

    • 完美。非常感谢!
    【解决方案2】:

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多