C++ 如何获取指针类型';什么是尖型?

C++ 如何获取指针类型';什么是尖型?,c++,typetraits,C++,Typetraits,我有一个指针类型Ptr。它可能是T*、唯一、共享或其他。如何在编译时获取其点类型?我尝试了以下方法,但失败了 template<class Ptr> void f() { typedef decltype(*Ptr()) T; // give unexpected results } 模板 void f() { typedef decltype(*Ptr())T;//给出意外结果 } 下面删除的答案非常有效 typedef typename std::remove_ref

我有一个指针类型Ptr。它可能是T*、唯一、共享或其他。如何在编译时获取其点类型?我尝试了以下方法,但失败了

template<class Ptr>
void f()
{
    typedef decltype(*Ptr()) T; // give unexpected results
}
模板
void f()
{
typedef decltype(*Ptr())T;//给出意外结果
}
下面删除的答案非常有效

typedef typename std::remove_reference<decltype(*std::declval<Ptr>())>::type T;
typedef typename std::remove_reference::type T;

这是一种方法

创建一个助手类,并使用适当的专门化来推断指针类型

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;
}
模板指针;
模板指针
{
T型;
};
模板指针
{
T型;
};
模板指针
{
T型;
};
模板
void f()
{
类型定义类型名称指针::类型指针类型;
}

当我看到别人已经把答案写出来的时候,我正在写这个答案,所以我放弃了。但另一个答案不见了,就在这里。如果原稿再次出现,我将删除此内容

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

std::remove\u reference::type

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


std::remove\u reference::type

它可能是T*、唯一的、共享的或其他的
-如何?多态性还是模板?@icepack作用域\u ptr或其他智能指针。只需要知道它的静态类型(编译器时间)。@user1899020问题是
Ptr
可以是没有解引用操作符的东西。@Jason那么它就不是指针了。我也不知道为什么会删除这个答案,但问题是当
Ptr
是(比如说)
int*
decltype(*Ptr())
计算为
int&
。事实上,这是一个参考,可能破坏了其他地方的编译。在
Ptr
之后至少需要一个
()
,比如
std::remove\u reference::type
。可能是打字错误。你的分析很好。@user1899020是的;谢谢你把它修好。这能解决问题吗?还是某些类型的错误仍然存在?现在一切都好了。谢谢。你能举一个例子来说明这是如何使用的吗?例如,我有一个从第三方库SomeCallBack(void*data){}调用的函数,我想知道转换数据需要什么类型to@eranotzap,我建议的解决方案不适用于
void*