c++:std::remove_pointer 到底做了什么?

Yan*_*v G 1 c++

我遇到过以下行:

std::weak_ptr<std::remove_pointer<decltype(myPublisher.get())>::type> captured_pub = myPublisher;
Run Code Online (Sandbox Code Playgroud)

我假设“remove_pointer”删除指针并返回对象本身,但这只是一个假设。这样做是为了最终用weak_ptr指向对象吗?

我试图理解“remove_pointer”的作用,但找不到满意的解释。有人可以解释一下这行代码吗?

Rem*_*eau 8

从内到外的工作:

  • myPublisher必须是类型变量std::shared_ptr<T>(在本例中T是某种未知类型)。myPublisher.get()因此返回一个T*指针变量,该变量指向共享所有权的某个T对象shared_ptr

  • decltype(...)返回给定变量/表达式的类型。在本例中,返回值get(),因此它返回T* 类型

  • std::remove_pointer<...>::type*从指定类型中删除。在本例中,返回T 类型.

  • std::weak_ptr<...>然后使用该类型作为其模板参数进行声明。在这种情况下,std::weak_ptr<T>

举例来说,假设T某个类名为PublishermyPublisher类型为 的对象也是如此std::shared_ptr<Publisher>,因此myPublisher.get()返回一个Publisher*指针,captured_puba 也是如此std::weak_ptr<Publisher>

  std::weak_ptr<std::remove_pointer<decltype(myPublisher.get())>::type> captured_pub = myPublisher;
= std::weak_ptr<std::remove_pointer<decltype(Publisher*)>::type> captured_pub = myPublisher;
= std::weak_ptr<std::remove_pointer<Publisher*>::type> captured_pub = myPublisher;
= std::weak_ptr<Publisher> captured_pub = myPublisher;
Run Code Online (Sandbox Code Playgroud)

另一种确定方法T是简单地使用shared_ptr::element_type成员,例如:

std::weak_ptr<decltype(myPublisher)::element_type> captured_pub = myPublisher;
Run Code Online (Sandbox Code Playgroud)

或者,只需让编译器weak_ptr根据分配给它的类型shared_ptr推断出 的模板参数,例如:

std::weak_ptr captured_pub = myPublisher;
Run Code Online (Sandbox Code Playgroud)