c++ 智能指针 和模板的应用,小白看不懂,求助求助!
本帖最后由 香喷喷的咸鱼 于 2022-4-15 20:24 编辑template<typename MessageT, typename AllocatorT, typename PublisherT>
std::shared_ptr<PublisherT>
Node::create_publisher(
const std::string & topic_name,
const rclcpp::QoS & qos,
const PublisherOptionsWithAllocator<AllocatorT> & options)
{
return rclcpp::create_publisher<MessageT, AllocatorT, PublisherT>(
*this,
extend_name_with_sub_namespace(topic_name, this->get_sub_namespace()),
qos,
options);
}
就是这一段代码有点不懂什么意思:
1.std::shared_ptr<PublisherT> 这部分是一个智能指针,它作为函数模板Node::create_publisher()的类型,具有怎样的意义?
2.const std::string & topic_name这句话的意思是 :这是一个不变的std::string类型的指向topic_name的地址 吗?
谢谢热心鱼油的帮助! 问题 1:{:10_245:}{:10_245:} 不是很明白。具有怎样的意义?是指智能指针有什么意义吗?
问题 2:const std::string & topic_name 其构造为:const 数据类型 & 标识符(这里的 & 符是引用的意思)用于避免深拷贝,又不想改变原本的值。 顶 顶 顶 {:10_254:} 666 std::shared_ptr<PublisherT>Node::create_publisher(const std::string & topic_name,const rclcpp::QoS & qos,const PublisherOptionsWithAllocator<AllocatorT> & options)
{};
下次这样放可能好看一点 本帖最后由 lhgzbxhz 于 2022-4-18 10:13 编辑
1. 我猜你问的是函数返回一个shared_ptr<xxx>的意义?函数尽量返回一个智能指针而非裸指针的意义可参见《Effective C++》条款13,而shared_ptr的意义还在《Effective Modern C++》条款19中有所补充。
简单来说,shared_ptr代表共享资源所有权,当你想要共享资源的所有权时就用(但为了避免开销过大,还是尽量返回unique_ptr,况且客户可以方便地把unique_ptr转换为shared_ptr。)
2. 这是一个天坑……你暂时可以这么理解:void f1(std::string& s);
void f2(const std::string& s);
void f3(std::string s)
int main()
{
f1("abc"); // 不行
f2("abc"); // 可以
f3("abc"); // 可以,但是有一次复制开销
}
像上述代码中f3那样传值,一般会有复制对象的开销(假设编译器不优化),所以一般会像f2, f1那样引用传参。
为什么上述代码中对f1的调用无法通过编译,而对f2的调用可以呢?因为参数"abc"实际上是通过const char*构造的一个std::string临时对象,而f1的参数类型为std::string&,这暗示了可以在f1函数内修改这一参数。(不管实际上有没有修改)而修改一个临时变量是不允许的,所以编译器拒绝了这种调用。
解决的方法就是像f2那样用const std::string&,主动告诉编译器:“我们不打算修改s参数”,编译便可以通过了。
但是:以上说的仅仅是C++98时代的内容,C++11加入了右值引用,并由此实现了移动语义与完美转发,上述写法一般被认为“过时了”。如果你想深入了解的话,《More Effective C++》有整整一章(条款23~30)是讲这个的,建议去看看。
加油 {:7_146:} 想入门的新人 发表于 2022-4-16 15:47
std::shared_ptrNode::create_publisher(const std::string & topic_name,const rclcpp::QoS & qos,const ...
好的,明白了 lhgzbxhz 发表于 2022-4-16 18:57
1. 我猜你问的是函数返回一个shared_ptr的意义?函数尽量返回一个智能指针而非裸指针的意义可参见《Effecti ...
感谢回复 傻眼貓咪 发表于 2022-4-15 22:00
问题 1: 不是很明白。具有怎样的意义?是指智能指针有什么意义吗?
问题 2:const s ...
1.我是想问这一段最后 ,返回的是不是std::shared_ptr<PublisherT>这个类型的地址。我的表述有问题,不好意思{:5_104:}
页:
[1]