Get base type of a template type (remove const/ref

2020-07-03 09:31发布

Is there a type traits template which returns the base type of a given type. By base type I mean the type with all value modifiers, const, volatile, etc. stripped off. For example, using a hypothetical traits function:

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

I'm aware of remove_const and remove_reference and am currently just using them in combination. I'm wondering if however there exists already such a trait and perhaps if there is a proper name to what I am referring?

3条回答
ら.Afraid
2楼-- · 2020-07-03 10:02

I would probaby define a type alias such as:

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

Notice, that here R. Martinho Fernandes proposes the name Unqualified for such a type alias.

The standard type trait std::decay, on the other hand does the same as the above and something more for array and function types, which may or may not be what you want.

查看更多
男人必须洒脱
3楼-- · 2020-07-03 10:03

try std::decay. It mimicks what happens when you pass arguments to functions by value: strips top-level cv-qualifiers, references, converts arrays to pointers and functions to function pointers.

Regards, &rzej

查看更多
不美不萌又怎样
4楼-- · 2020-07-03 10:03

Obviously it depends on what exactly you want to remove from the type. std::decay could be what you are looking for (removes references, const/volatile, decays array to pointer and function to function pointer). If you don't want the array to pointer and function to functionpointer decay, you need to stick with std::remove_reference and std::remove_cv (removes const and volatile). Of course you could combine the two into your own typetrait to make using it easier.

查看更多
登录 后发表回答