【问题标题】:What does the asterix '*' after a template type mean?模板类型后的星号“*”是什么意思?
【发布时间】:2019-01-16 20:54:39
【问题描述】:

我来的模板代码在模板类型之后使用*

  ...
  template <typename _Up, typename _Ep, typename = void>
  struct _Ptr
  {
      using type = _Up*; 
  };
  ...

我看到的另一种用法

   ...
   template <typename T, typename \
   std::enable_if<std::is_integral<T>::value,T>::type* = nullptr>
   ...

这个结构在哪里描述?

【问题讨论】:

  • 请注意,_Up_Ep_Ptr 是保留标识符,因此除非您在标准库的实现中遇到这种情况,否则标识符的使用将具有未定义的行为。
  • 看起来您正在深入研究标准库的实现。在使用此代码作为 Shining Example 进行模仿之前,请注意只有标准库实现 is allowed to use underscores in particular ways
  • @eerorika:不知道。我只是浏览 /usr/include/c++/* 中的 unique_pointer 代码。
  • @KonradEisele 很好,这可以解释为什么他们使用为此目的而保留的标识符。请记住不要模仿他们使用下划线。
  • @KonradEisele 我真诚地不鼓励你通过查看 STL 实现来学习 C++。

标签: c++ templates


【解决方案1】:

与任何类型的含义相同 - 它是一个指向 typestd::enable_if 内定义的指针,专门用于真实条件,默认情况下为 void - 产生所有熟悉的 void*

在一个完全不同的(可能是不明智的)注意上,这不是我第一次看到您提出的涉及相当复杂主题的问题(SFINAE 就是一个),这表明一些基本的基础知识还不存在。我真诚地推荐阅读一本好的 C++ 书籍 - 你可以在这里找到精选列表:The Definitive C++ Book Guide and List

【讨论】:

  • 另外,顺便说一句,该标准目前尚未确定其是否格式正确,因为void* 不是指向类类型的指针。
  • @AndyG 那是我不熟悉的东西!你有一些进一步的阅读建议吗?
  • 感谢您的书单。是的,我还在学习……“Effective Modern C++”其实我已经学过了。
  • @SergeyA:确实如此。在发现这个事实之前,我使用了这个模式很长时间。使用typename std::enable_if&lt;condition, int&gt;::type = 0是安全的
  • @AndyG 我也切换使用typename std::enable_if&lt;condition, bool&gt;::type = true/std::enable_if_t&lt;condition, bool&gt; = true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 1970-01-01
  • 2023-03-28
  • 2011-10-20
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多