std::common_type is a trait from the standard library. This trait allows you to pass an arbitrary number of types, processes them, and outputs their common type. std::common_type became first available in the C++11 standard. When obtaining a common type, std::common_type relies upon the conditional operator and does some conversions we'll review below.
namespace std
{
template <typename ...>
struct common_type; // (1)
template <typename ...Ts>
using common_type_t = typename common_type<Ts...>::type;
template <>
struct common_type<> // (2)
{
};
template <class T>
struct common_type<T> // (3)
{
using type = std::decay_t<T>;
};
template <class T, class U>
struct common_type<T, U> // (4)
{
using type = decay_t<decltype( true ? declval< std::decay_t<T> >()
: declval< std::decay_t<U> >() ) >;
};
template <class T, class U, class ...V>
struct common_type<T, U, V...> // (5)
{
using type = typename common_type<typename common_type<T, U>::type,
V...>::type;
};
}
It's worth mentioning that common_type is implemented in the standard library in a similar way. Now let's examine the code above and see what happens there:
Helpful links
0