相关疑难解决方法(0)

在C++中传递回调函数参数的最佳方法

在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

c++ templates callback parameter-passing

14
推荐指数
1
解决办法
2424
查看次数

我什么时候应该std ::转发函数调用?

我在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表达式使用熟悉的模板语法,这似乎是一个很好的用例,以防我们想要使计时器类型成为编译时常量.

c++ lambda perfect-forwarding c++14 forwarding-reference

9
推荐指数
1
解决办法
2052
查看次数

在C++中定义一个'for'循环宏

也许它不是很好的编程实践,但可以定义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)

c++ loops for-loop c-preprocessor

7
推荐指数
3
解决办法
2万
查看次数