我遇到了以下行:
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
的类,因此myPublisher
是std::shared_ptr<Publisher>
类型的对象,并且myPublisher.get()
返回Publisher*
指针,因此captured_pub
是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;
确定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;