【问题标题】:Get base type of a template type (remove const/reference/etc.)获取模板类型的基本类型(删除 const/reference/etc.)
【发布时间】:2013-05-25 12:27:06
【问题描述】:

是否有返回给定类型的基本类型的类型特征模板。 基本类型是指去掉了所有值修饰符、const、volatile 等的类型。例如,使用假设的特征函数:

base<int>::type == int
base<int const>::type == int
base<int&>::type == int

我知道remove_constremove_reference,目前只是将它们结合使用。我想知道是否已经存在这样的特征,或者我所指的东西是否有合适的名称?

【问题讨论】:

  • typename std::remove_cv&lt;typename std::remove_reference&lt;T&gt;::type&gt;::type?
  • @AndyProwl,是的,这就是我现在所做的......我想这确实涵盖了引用类型的所有方式。

标签: c++ templates c++11


【解决方案1】:

我可能会定义一个类型别名,例如:

template<typename T>
using base_type = typename std::remove_cv<typename std::remove_reference<T>::type>::type;

注意,hereR. Martinho Fernandes 建议将名称 Unqualified 用于此类类型别名。

另一方面,标准类型特征 std::decay 与上述相同并且更多的是用于数组和函数类型,这可能是也可能不是你想要的。

【讨论】:

  • Unqualifiedstd::common_type 相比如何(我做了test,即使是both traits)?
  • @chris:嗯,这令人困惑。也许我遗漏了一些东西,但是当只有一个类型参数时,标准没有指定 common_type&lt;T&gt; 应该是 T 吗?
  • 我知道它可以用作身份模板,但据我所见,它删除的只是简历和引用。我不知道它是否对其他任何东西都这样做。
  • @chris:我的意思是,根据标准,它不应该删除 cv 和引用,所以这可能是一个错误?
【解决方案2】:

试试std::decay。它模仿了按值向函数传递参数时发生的情况:去除顶级 cv 限定符、引用、将数组转换为指针和将函数转换为函数指针。

问候, &rzej

【讨论】:

  • 使用std::decay_t&lt;..&gt; 更好,直接给出“原始”类型。 :)
【解决方案3】:

显然,这取决于您要从类型中删除的确切内容。 std::decay 可能是您要查找的内容(删除引用,const/volatile,将数组衰减为指针,函数衰减为函数指针)。如果您不希望数组指向指针和函数指向函数指针衰减,则需要坚持使用std::remove_referencestd::remove_cv(删除constvolatile)。当然,您可以将两者结合到您自己的 typetrait 中,以便更轻松地使用它。

【讨论】:

猜你喜欢
  • 2013-01-22
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多