c++: std::remove_pointer到底是做什么的?

  • 本文关键字:remove std pointer c++ c++
  • 更新时间 :
  • 英文 :


我遇到了以下行:

std::weak_ptr<std::remove_pointer<decltype(myPublisher.get())>::type> captured_pub = myPublisher;

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

我试图理解什么"remove_pointer"是的,但找不到令人满意的解释。有人能解释一下这行代码吗?

从内到外工作:

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

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

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

  • 然后用类型作为其模板参数来声明
  • std::weak_ptr<...>。在本例中,std::weak_ptr<T>.

例如,假设T是某个名为Publisher的类,因此myPublisherstd::shared_ptr<Publisher>类型的对象,并且myPublisher.get()返回Publisher*指针,因此captured_pubstd::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;

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

std::weak_ptr<decltype(myPublisher)::element_type> captured_pub = myPublisher;

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

std::weak_ptr captured_pub = myPublisher;

最新更新