在C++ 中传递回调函数参数的最佳方法是什么?
我想过简单地使用模板,像这样:
template <typename Function>
void DoSomething(Function callback)
Run Code Online (Sandbox Code Playgroud)
这是例如std::sort用于比较功能对象的方式.
通过使用&&怎么样?例如:
template <typename Function>
void DoSomething(Function&& callback)
Run Code Online (Sandbox Code Playgroud)
这两种方法的优点和缺点是什么,为什么STL使用前者std::sort?
我在Effective Modern C++中看到的代码片段巧妙地实现了创建函数计时器的工具原理:
auto timeFuncInvocation =
[](auto&& func, auto&&... params)
{
start timer;
std::forward<decltype(func)>(func)(
std::forward<decltype(params)>(params)...);
stop timer and record elapsed time;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是关于 std::forward<decltype(func)>(func)(...
对于在lambda表达式中使用熟悉的模板语法,这似乎是一个很好的用例,以防我们想要使计时器类型成为编译时常量.
也许它不是很好的编程实践,但可以定义for循环宏吗?
例如,
#define loop(n) for(int ii = 0; ii < n; ++ ii)
Run Code Online (Sandbox Code Playgroud)
效果很好,但不能让你改变变量名ii.
它可以用于:
loop(5)
{
cout << "hi" << " " << "the value of ii is:" << " " << ii << endl;
}
Run Code Online (Sandbox Code Playgroud)
但是没有名称/符号的选择ii.
可以这样做吗?
loop(symbol_name, n)
Run Code Online (Sandbox Code Playgroud)
程序员将符号名称插入" symbol_name".
用法示例:
loop(x, 10)
{
cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)