std::common_type – это средство для вывода общего типа из стандартной библиотеки для произвольного числа переданных типов. Впервые он появился в стандарте C++11. При выводе общего типа std::common_type полагается на тернарный оператор, делая некоторые преобразования, которые мы рассмотрим ниже.
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;
};
}
Стоит отметить, что примерно так common_type и реализован в стандартной библиотеке. Теперь, давайте подробно разберём, что тут происходит:
0