通过 lambda 表达式中的指针调用函数

问题描述

我有一个向量,它存储类型为 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() 实现。你在上面看到的是我的第一次尝试。

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

Stretch 的目标也是用指针替换 std::vector<Sensor*> sensors;std::vector<Sensor*>* sensors;,这样我就不必处理副本了。在这种情况下,实现会是什么样子?

解决方法

嗯。

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 是一个很好的实践问题,但我不会那样写。这也意味着我可能弄错了代码。

,

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

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

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