【问题标题】:Calling function via pointer in lambda expression通过 lambda 表达式中的指针调用函数
【发布时间】:2021-04-22 16:18:33
【问题描述】:

我有一个向量,它存储Sensor 类型的类,每个类都有一个成员函数refresh()。这个向量是我班级的成员LogManager

class Sensor
{
    public:
        void refresh();
}

class LogManager
{
    private:
        std::vector<Sensor*> sensors;

        void refresh_sensors()
        {
            // TODO: use foreach
            
            for (uint i=0; i<sensors.size(); i++)
            {
                sensors[i]->refresh();
            }

            for_each(sensors.begin(), sensors.end(), [sensors]( void* ) void* -> {refresh();} );
        }
}

我想做的是将 for 循环更改为 std::for_each() 实现。您在上面看到的是我的第一次尝试。

如何使用for_each() 函数访问成员函数Sensor::refresh()? 使用类似上面的标准 for 循环,我只使用 -&gt; 运算符。

Stretch 的目标也是用指针替换std::vector&lt;Sensor*&gt; sensors;std::vector&lt;Sensor*&gt;* sensors;,这样我就不必使用副本了。在这种情况下,实现会如何?

【问题讨论】:

    标签: c++ lambda foreach


    【解决方案1】:

    嗯。

    for_each(sensors.begin(), sensors.end(), []( Sensor * sensor ) void -> { sensor->refresh(); } );
    

    我没有尝试编译它,所以可能存在语法问题。我改变的事情:

    1. 您没有使用 [sensors] 部分,所以我清空了它。
    2. 如果您使用的是 void *,则几乎可以肯定您正在做一些非常不像 C++ 的事情。我把它改成了合适的类型。
    3. 您没有返回任何值,因此我将 void * 更改为 void。

    我实际上并没有使用 for_each。我个人认为这段代码更干净:

    for (Sensor * sensor: sensors) {
        sensor->refresh();
    }
    

    我认为这明显更容易阅读。所以使用 for_each 是一个很好的实践问题,但我不会那样写。这也意味着我可能弄错了代码。

    【讨论】:

    • 谢谢你们,事实上。我想我需要对 lambdas 做一些学习。我使用了for_each() 函数,因为如果我将向量更改为指向向量的指针,我想它更易于阅读。帮了大忙,谢谢!
    【解决方案2】:

    您不需要在 for_each 的 lambda 中捕获任何内容。相反,向量中的每个指针都应该作为参数传递:

    std::for_each(sensors.begin(), sensors.end(), 
                  [](Sensor* s) { s->refresh();});
    

    您不需要(也不应该)使向量成为指针,除非您想在不复制的情况下传递它。因为它是一个私有数据成员,所以这可能不是一个好主意,无论如何您都可以使用引用来做到这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2018-01-03
      • 1970-01-01
      • 2014-02-17
      • 2011-02-28
      相关资源
      最近更新 更多