获取模板类型的基类型(删除const / reference / etc.)

时间:2013-05-25 12:27:06

标签: c++ templates c++11

是否有类型特征模板返回给定类型的基本类型。通过基类型我的意思是带有所有值修饰符的类型,const,volatile等被剥离。例如,使用假设特征函数:

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

我了解remove_constremove_reference,目前我正在组合使用它们。我想知道是否已经存在这样的特征,也许是否有一个正确的名称,我所指的是什么?

3 个答案:

答案 0 :(得分:13)

我会想象一个类型别名,例如:

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

请注意,here R. Martinho Fernandes为此类别别建议使用名称Unqualified

另一方面,标准类型特征std::decay与上面的相同,对于数组和函数类型更多,这可能是您想要的也可能不是。< / p>

答案 1 :(得分:4)

尝试std::decay。它模仿了当你通过值传递参数时发生的事情:剥离顶级cv限定符,引用,将数组转换为指针,将函数转换为函数指针。

此致 &安培; rzej

答案 2 :(得分:1)

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