C++ C++;泛型函数参数(不同参数)

C++ C++;泛型函数参数(不同参数),c++,function-pointers,C++,Function Pointers,我正在尝试编写一个基准函数,但我需要能够传入任何要测试的函数。传入的函数都是返回类型void,但它们的参数不同。我相信这是一件简单的事情,但我不确定最好的方法 // 95% confidence interval void benchmark(int n) { int res[n]; for (int i = 0; i < n; i++) { uint64_t start = GetTimeMs64(); // **TODO: code to benchmark..

我正在尝试编写一个基准函数,但我需要能够传入任何要测试的函数。传入的函数都是返回类型void,但它们的参数不同。我相信这是一件简单的事情,但我不确定最好的方法

// 95% confidence interval
void benchmark(int n)
{
  int res[n];
  for (int i = 0; i < n; i++) {
    uint64_t start = GetTimeMs64();
    // **TODO: code to benchmark...**
    uint64_t end = GetTimeMs64();
    res[i] = end - start;
  }

  double avg = 0.0;
  for (int i = 0; i < n; i++) avg += res[i];
  avg /= double(n);

  double variance = 0.0;
  for (int i = 0; i < n; i++) {
    variance += ((res[i] - avg) * (res[i] - avg));
  }
  variance /= double(n - 1);
  cout << "Sample mean: " << avg << " +/- " << (1.96 * (sqrt(variance) / sqrt(n))) << endl;
}

您可以使用如下内容将您的
基准测试
函数作为模板

#include <utility>
void A(int, char) { }
void B(int) { }

template<typename... Args>
void benchmark(int n, void(&func)(Args...), Args&&... args)
{
  func(std::forward<Args>(args)...);
}

int main()
{
  benchmark(1, A, 2, 'c');
  benchmark(1, B, 2);
}
#包括
void A(int,char){}
空B(int){}
模板
无效基准(int n、void和func)(参数…、参数和…参数)
{
func(std::forward(args)…);
}
int main()
{
基准(1,A,2,'c');
基准(1、B、2);
}

如果有必要,您可以通过为返回类型添加额外的模板参数使其更加通用。

基本思想是就函数的签名向编译器撒谎,用任何合适的参数调用它,希望您永远不要出错,因为编译器将无法帮到您。除非您编写它是为了好玩,请看一看,您可以使用某种类型的擦除将多重签名函数及其参数存储到具有相同签名的函子中。谢谢,@ScottHunter!一些我完全没有想到的事情:它会影响基准测试结果约10毫秒,因为这是额外的操作。
#include <utility>
void A(int, char) { }
void B(int) { }

template<typename... Args>
void benchmark(int n, void(&func)(Args...), Args&&... args)
{
  func(std::forward<Args>(args)...);
}

int main()
{
  benchmark(1, A, 2, 'c');
  benchmark(1, B, 2);
}