类模板与函数模板的对比

从语法上说,C++支持类模板也支持函数模板,这二者对应的语义却有重叠部分,有些功能既可以通过类模板完成也能通过函数模板完成,下面通过Ros1和Ros2中Publisher的实现对比一下:

在Ros1中,Publisher的实现如下:

//define
class ROSCPP_DECL Publisher {
    template <typename M>
    void publish(const boost::shared_ptr<M>& message) const {
         //...
     }
}
//use
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
std_msgs::String msg;
std::stringstream ss;
ss << "hello world "
msg.data = ss.str();
chatter_pub.publish(msg);

在Ros2中,Publisher的实现如下:

//define
template<typename MessageT, typename Alloc = std::allocator<void>>
 class Publisher : public PublisherBase
 {
   virtual void
   publish(std::unique_ptr<MessageT, MessageDeleter> & msg)
   {
        //...
   }
}
//use
auto pNode = std::make_shared<rclcpp::Node>("node");
auto marker_pub_ = pNode->create_publisher<visualization_msgs::msg::Marker>("slots_points", 10);
marker_pub_->publish(*marker_msg);

Ros1中,Publisher是一个普通的类,使用者需要自己保证publish的类型和前面advertise后面的参数模板类型保持一致,否则会出错。

Ros2中,Publisher是一个模板类,所以类型特征是和类绑定的,编译器可以帮助程序员检测publish的类型释放和模板类型相同,如果不相同会有编译错误提示。

这么看,模板类相对于普通类+模板函数是有优势的,但也不尽然,由于模板类中,参数是类型的一部分,所以他们是没办法动态添加的,必须要在写代码的时候就指定好类型,进一步,它们也没办法用STL中的容器进行管理(STL容器只能放同类型的对象,而不同类型对应的Publisher属于不同类型)。

所以模板类可以提供更多的静态安全保证,但代码灵活性也有一些牺牲。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值