我有一个指针类型Ptr。它可能是T *,unique_ptr,shared_ptr或其他。如何在编译时获取其尖头类型?我尝试以下但失败了
template<class Ptr>
void f()
{
typedef decltype(*Ptr()) T; // give unexpected results
}
以下删除的答案效果很好。
typedef typename std::remove_reference<decltype(*std::declval<Ptr>())>::type T;
答案 0 :(得分: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;
}
答案 1 :(得分:3)
当我看到其他人已发布此答案时,我正在写这个答案,所以我放弃了。但后来其他答案消失了,所以就在这里。如果原件重新出现,我将删除它。
如果Ptr
是(例如)int*
,则decltype(*Ptr())
评估为int&
而不是int
,这可能是导致错误的原因(不管是什么)。尝试:
std::remove_reference<decltype(*Ptr())>::type
或者,如果可能Ptr
可能没有默认构造函数:
std::remove_reference<decltype(*std::declval<Ptr>())>::type