具有任意数量参数的模板函数
Template function with an arbitrary number of arguments
我想编写一个函数invoke_measure_time
来测量作为参数给出的任何其他函数的执行时间。我部分解决了我的问题,我有以下一段代码:
int sum(int a, int b){
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
return a + b;
}
template<typename T>
std::pair<std::chrono::milliseconds, T> invoke_measure_time(std::function<T()> f){
auto start = std::chrono::system_clock::now();
auto f_result = f();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start);
return std::make_pair(duration, f_result);
}
int main(){
auto fun = std::bind(sum, 10, 20);
auto emma = invoke_measure_time<int>(fun);
std::cout << "time: " << emma.first.count() << ", result = " << emma.second << std::endl;
}
它工作正常,结果符合预期,但第一行main
让我头疼。如何修改invoke_measure_time
以接受任何函数,而不仅仅是没有参数的函数?我希望我的主要看起来像:
int main(){
auto emma = invoke_measure_time<int, int, int>(sum, 10, 20);
std::cout << "time: " << emma.first.count() << ", result = " << emma.second << std::endl;
}
或类似的东西。我怎样才能做到这一点?
如果您将 temaplte 类型更改为泛型类型,那么我们可以添加一个可变参数模板参数来获取函数的参数。
template<typename Function, typename... Args>
auto invoke_measure_time(Function f, Args&&... args) {
auto start = std::chrono::system_clock::now();
auto f_result = f(std::forward<Args>(args)...);
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start);
return std::make_pair(duration, f_result);
}
获取任何函数(如 type(,并将传递给它的参数转发给invoke_measure_time
。 它还具有能够像
int main(){
auto emma = invoke_measure_time(sum, 10, 20);
std::cout << "time: " << emma.first.count() << ", result = " << emma.second << std::endl;
}
简单的解决方案是invoke_measure_time
接受任何可以在没有参数的情况下调用的函数对象(为了简洁起见,我省略了计时内容(:
template <typename F>
auto invoke_and_measure(F f) -> decltype(f()) {
return f();
}
然后是任何功能,具有任意参数,例如您的sum
:
int sum(int a,int b) { return a+b; }
可以包装到一个可以在没有参数的情况下调用的 lambda 中:
int main() {
auto x = invoke_and_measure([](){ return sum(1,2);});
std::cout << x;
}
现场示例
请注意,lambda 通常比bind
更容易使用。有一些极端情况bind
可以做,但不能做lambda,但实际上我从头顶上不知道;)
您可以执行以下操作:
template<typename F, typename ... Ts>
auto invoke_measure_time(F&& f, Ts&&... args)
{
auto start = std::chrono::system_clock::now();
auto f_result = std::invoke(std::forward<F>(f), std::forward<Ts>(args)...);
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start);
return std::make_pair(duration, f_result);
}
演示
顺便说一句,当f
返回void
是有问题的。
相关文章:
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数