【问题标题】:How to get a pointer type's pointed type?如何获取指针类型的指向类型?
【发布时间】:2014-05-16 20:00:57
【问题描述】:

我有一个指针类型 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;

【问题讨论】:

  • It might be T*, unique_ptr, shared_ptr, or others - 怎么样?多态还是模板?
  • @icepack scoped_ptr 或其他智能指针。只需要知道它的静态类型(编译时)。
  • @user1899020 问题是Ptr 可以是没有解引用运算符的东西。
  • @Jason 那么它就不是指针了。
  • 我也不确定为什么这个答案也被删除了,但问题是当Ptr 是(比如说)int*decltype(*Ptr()) 的结果是int&amp;。它是一个参考的事实可能会破坏其他地方的编译。

标签: c++ typetraits


【解决方案1】:

这是一种方法。

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

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;
}

【讨论】:

  • 你能发布一个如何使用它的例子吗?例如,我有一个从某个 3rd 方库 SomeCallBack(void* data) { } 调用的函数我想知道我需要将数据转换为什么类型
  • @eranotzap,我建议的解决方案不适用于void*
【解决方案2】:

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

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

std::remove_reference&lt;decltype(*Ptr())&gt;::type

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

std::remove_reference&lt;decltype(*std::declval&lt;Ptr&gt;())&gt;::type

【讨论】:

  • 试过了。在Ptr 之后至少需要一个(),比如std::remove_reference&lt;decltype(*Ptr)&gt;::type。可能是笔误。你的分析很好。
  • @user1899020 是的;感谢您解决这个问题。这是否解决了问题,或者您仍然有某些类型的错误?
  • 现在一切正常。谢谢。
  • 这似乎不太可靠,因为如果Ptrvoid*,则不允许取消引用void *
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 2017-06-29
  • 2011-09-14
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多