• (c++版本)lambda表达式实现ROS2发布者节点(面向对象款式)(已经修正,可以运行)


    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include "sys/time.h"
    7. #include "rclcpp/rclcpp.hpp"
    8. #include "std_msgs/msg/string.hpp"
    9. using namespace std;
    10. using namespace rclcpp;
    11. class cnode;
    12. cnode * pnode;
    13. //C++
    14. class cnode:public rclcpp::Node
    15. {
    16. public:
    17. cnode(string str):Node(str) //constructor
    18. {
    19. timer_=this->create_wall_timer(500ms,[this]()->void {return this->cnode::timer_callback(); });
    20. }
    21. private:
    22. uint32_t count1=0;
    23. stringstream ss;
    24. std_msgs::msg::String MESSAGE1;
    25. rclcpp::TimerBase::SharedPtr timer_;
    26. std::shared_ptr> ppublisher=0;
    27. void timer_callback()
    28. {
    29. ss.str("");
    30. ss<<"hello nice to meet you"<
    31. MESSAGE1.data=ss.str();
    32. ppublisher=this->create_publisher("topicName",10);
    33. ppublisher->publish(MESSAGE1); //error occured
    34. }
    35. };
    36. int main(int argc,char ** argv)
    37. {
    38. rclcpp::init(argc,argv);
    39. cnode mynode("talker");
    40. pnode=&mynode;
    41. std::shared_ptr p(pnode);
    42. spin(p);
    43. rclcpp::shutdown();
    44. return 0;
    45. }

    这个里面没有使用bind函数作为返回参数,而使用了lambda函数作为了返回参数也就是回调函数。后面可能也会用一用这个bind函数,还有啊我要说一下有2个老师这个词语都没有读对,这个函数多做baind,麻烦去查一下词典,聋哑英语害死人

    lambda表达式在这个里面的语句是:

            timer_=this->create_wall_timer(500ms,[this]()->void {return this->mynode::timer_callback(); });出现在这个语句里面;

    而lambda表达式就是这部分       

    [this]()->void {return this->mynode::timer_callback(); }

    这是一个整体表达式叫做lambda表达式。首先这个个东西的本质是一个没有名字的函数---无名函数。他的返回值是有函数体里面return决定的,这里return this->mynode::timer_callback(),那么返回值就是这个东西这应该就是返回了一个函数了。

    为什么要使用这个东西呢?我们的目标就是要把定时器到了时间点的时候,把处理的函数放在这个位置,如果是普通的函数就直接用函数名可以了,但是timer_callback()是一个类的成员函数,

    如果直接将放进去,就会出现一个疑问:是那个对象调用的这个函数?所以需要指明是this.就是我们自己的这个对象调用的。实现这个功能可以使用lambda表达式,所以就是这么回事:

    【】中括号里面写个this是表示我要使用this这个参数,并且是值传递,不是引用传递,如果引用传递使用¶m_name这样的款式,[¶m_name](int a,int b)->void {   ;}

  • 相关阅读:
    C++ 【模版进阶】模版分离编译 模版特化
    git代码回退方法简要总结
    中华人民共和国消费者权益保护法
    进程间的通信方式
    DevExpress Office文件API打印 PDF 文档
    在Spring Boot中使用进程内缓存和Cache注解
    Redis从入门到放弃(7):主从复制
    自用的一些网址,码住!
    spring boot 中的异步@Async
    spring总结
  • 原文地址:https://blog.csdn.net/geniusChinaHN/article/details/133486890