如何解决通过 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(); } );
我没有尝试编译它,所以可能存在语法问题。我改变的事情:
- 您没有使用 [sensors] 部分,所以我将其清空。
- 如果您使用 void *,则几乎可以肯定您正在做一些非常类似于 C++ 的事情。我将其更改为正确的类型。
- 您没有返回任何值,因此我将 void * 更改为 void。
我实际上并不使用 for_each。我个人认为这段代码更简洁:
for (Sensor * sensor: sensors) {
sensor->refresh();
}
我认为这更容易阅读。所以使用 for_each 是一个很好的实践问题,但我不会那样写。这也意味着我可能弄错了代码。
,您不需要在 for_each
中的 lambda 中捕获任何内容。相反,向量中的每个指针都应该作为参数传递:
std::for_each(sensors.begin(),[](Sensor* s) { s->refresh();});
您不需要(也不应该)使向量成为指针,除非您想在不复制的情况下传递它。由于它是私有数据成员,这可能不是一个好主意,无论如何您都可以使用引用来做到这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。