类模板与函数模板的对比

从语法上说,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属于不同类型)。

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

猜你喜欢

转载自blog.csdn.net/cyfcsd/article/details/129928724