【问题标题】:Is there a type-trait to remove top-level cv and reference at once?是否有类型特征可以立即删除顶级 cv 和引用?
【发布时间】:2011-06-05 22:26:32
【问题描述】:

我只是想知道标准是否已经提供了一个。我知道自己做一个很容易

// for C++03, use <tr1/type_traits> and std::tr1
#include <type_traits>

template<class T>
struct remove_toplevel{
  typedef typename std::remove_reference<T>::type noref_T;
  typedef typename std::remove_cv<noref_T>::type noref_nocv_T;
  typedef noref_nocv_T type;
};

但我想我在那里忘记了一些东西或者顺序有误,所以如果有一个准备好的,那就太好了。

【问题讨论】:

  • 您可能打算将remove_cv 应用于noref_T,而不是像上面的代码中那样应用于T
  • @Andrey:糟糕,谢谢,是一个错字。 :)

标签: c++ c++11 typetraits


【解决方案1】:

std::decay,我相信,执行此功能。

【讨论】:

  • 完美,我知道有什么东西!我以为decay 仅适用于array -&gt; pointer 等。
  • 这很有趣,好问题。这是MSDN description of std::decay()。顺便说一句,如果您确实需要构建自己的 trait,您可以将所有 typedef 链接到一行以减少冗长。
  • @Xeo: 可以肯定的是decay 的功能是复制模板参数推导,或者类似的东西。 array -&gt; pointer 是我在标准中唯一知道的称为 decay 的东西,但除此之外,很容易造成混淆。
  • 浏览了 C++0x FDIS 文档,在decay 上的20.9.7.6 [meta.trans.other] 下找到了这句话:“这种行为类似于左值到右值、数组到指针和将左值表达式用作右值时应用函数到指针的转换,但也会从类类型中去除 cv 限定符以便更紧密地模拟按值参数传递。"
  • decay 做了很多与删除 ref 和 cv 限定符完全正交的事情。它确实做到了。但这个答案就像有人问如何喝水,你告诉他们可以使用消防水带。
【解决方案2】:

我更喜欢结合这两个功能,因为它准确地描述了意图是什么:

C++11 std::remove_cv&lt;std::remove_reference&lt;T&gt;::type&gt;::type

C++14 std::remove_cv_t&lt;std::remove_reference_t&lt;T&gt;&gt;

C++20 std::remove_cvref_t&lt;T&gt;

【讨论】:

  • remove_cvremove_reference 之间的顺序是否重要,如果是,哪些情况会产生差异?
猜你喜欢
  • 2022-10-02
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
相关资源
最近更新 更多