如何获得指针类型的指向类型?

use*_*020 6 c++ type-traits

我有一个指针类型Ptr.它可能是T*,unique_ptr,shared_ptr或其他.如何在编译时获取其尖头类型?我尝试以下但失败了

template<class Ptr>
void f()
{
    typedef decltype(*Ptr()) T; // give unexpected results
}
Run Code Online (Sandbox Code Playgroud)

以下删除的答案非常有效.

typedef typename std::remove_reference<decltype(*std::declval<Ptr>())>::type T;
Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 12

这是一种方法.

创建一个辅助类,使用适当的特化来推导指针类型.

template <typename T> Pointer;

template <typename T> Pointer<T*>
{
   typedef T Type;
};

template <typename T> Pointer<shared_ptr<T>>
{
   typedef T Type;
};

template <typename T> Pointer<unique_ptr<T>>
{
   typedef T Type;
};

template<class Ptr>
void f()
{
    typedef typename Pointer<Ptr>::Type PointerType;
}
Run Code Online (Sandbox Code Playgroud)


dlf*_*dlf 4

我正在写这个答案,看到别人已经发了,所以我放弃了。但后来那个答案消失了,所以就在这里。如果原版再次出现,我会删除它。

如果Ptr是(例如)int*,则decltype(*Ptr())计算结果为int&而不是int,这可能是错误的原因(无论是什么)。尝试:

std::remove_reference<decltype(*Ptr())>::type

或者,如果可能的话Ptr可能没有默认构造函数:

std::remove_reference<decltype(*std::declval<Ptr>())>::type