C++ 泛型函数参数(不同的参数)
C++ Generic Function Parameter (different arguments)
我正在尝试编写一个基准测试函数,但我需要能够传入任何要测试的函数。传入的函数都是返回类型的 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;
}
例如,我想做这样的事情:
void A(int a, int b) { return a + b; }
void B(int a) { return a * a; }
benchmark(100, A);
benchmark(100, B);
您可以使用
如下所示的内容使benchmark
函数成为模板
#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);
}
如有必要,可以通过为返回类型添加额外的模板参数来使其更加通用。
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 可变参数泛型 lambda 和函数重载
- 以特征类型作为参数的泛型函数回调
- 具有静态大小数组作为参数的泛型 lambda
- 是否可以使用泛型枚举类型作为函数的参数?
- 将泛型函数及其参数传递给元函数
- 是否可以使用默认泛型参数在C++中定义 lambda?
- 具有泛型列表参数和委托的函数
- 在C++中,如何根据类中的参数返回不同的泛型类型
- 在泛型编程中选择类型参数
- 继承类中没有匹配的泛型委托作为 lambda 参数
- C++ 具有非泛型参数的模板专用化
- 声明一个模板函数,该函数接收两个泛型迭代器作为参数
- C++ 使用数组作为参数创建泛型函数
- 将泛型结构作为接口中的参数传递
- 使用具有不同输入参数和不同返回类型的模板的泛型函数
- 接受泛型列表类型对象的参数
- 无法推断模板参数 - 泛型函数
- 如何创建可变参数泛型 lambda