香喷喷的咸鱼 发表于 2022-4-15 20:10:31

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的地址   吗?

谢谢热心鱼油的帮助!

傻眼貓咪 发表于 2022-4-15 22:00:41

问题 1:{:10_245:}{:10_245:} 不是很明白。具有怎样的意义?是指智能指针有什么意义吗?
问题 2:const std::string & topic_name 其构造为:const 数据类型 & 标识符(这里的 & 符是引用的意思)用于避免深拷贝,又不想改变原本的值。

心驰神往 发表于 2022-4-16 07:59:55

okamn 发表于 2022-4-16 08:29:52

1molHF 发表于 2022-4-16 09:59:52

tianlai7266 发表于 2022-4-16 13:46:08

{:10_254:}

东方天晨 发表于 2022-4-16 13:55:42

666

想入门的新人 发表于 2022-4-16 15:47:21

std::shared_ptr<PublisherT>Node::create_publisher(const std::string & topic_name,const rclcpp::QoS & qos,const PublisherOptionsWithAllocator<AllocatorT> & options)
{};
下次这样放可能好看一点

lhgzbxhz 发表于 2022-4-16 18:57:59

本帖最后由 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)是讲这个的,建议去看看。

tjweiyanmin 发表于 2022-4-16 20:49:43

加油

超级无敌磊果果 发表于 2022-4-16 21:10:06

{:7_146:}

香喷喷的咸鱼 发表于 2022-4-18 10:02:30

想入门的新人 发表于 2022-4-16 15:47
std::shared_ptrNode::create_publisher(const std::string & topic_name,const rclcpp::QoS & qos,const ...

好的,明白了

香喷喷的咸鱼 发表于 2022-4-18 10:04:37

lhgzbxhz 发表于 2022-4-16 18:57
1. 我猜你问的是函数返回一个shared_ptr的意义?函数尽量返回一个智能指针而非裸指针的意义可参见《Effecti ...

感谢回复

香喷喷的咸鱼 发表于 2022-4-18 11:38:18

傻眼貓咪 发表于 2022-4-15 22:00
问题 1: 不是很明白。具有怎样的意义?是指智能指针有什么意义吗?
问题 2:const s ...

1.我是想问这一段最后   ,返回的是不是std::shared_ptr<PublisherT>这个类型的地址。我的表述有问题,不好意思{:5_104:}
页: [1]
查看完整版本: c++ 智能指针 和模板的应用,小白看不懂,求助求助!