Пространства имён
Варианты
Действия

std::common_type

Материал из cppreference.com
< cpp‎ | types
 
 
 
Поддержка типов
Основные типы
Оригинал:
Basic types
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Основные типы
Исправлены типы целых ширину (C++11)
Числовые пределы
Оригинал:
Numeric limits
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
С числовым ограничивает интерфейс
Время тип информации
Оригинал:
Runtime type information
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Тип черты
Оригинал:
Type traits
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Первичные категории типа
Оригинал:
Primary type categories
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Тип свойства
Оригинал:
Type properties
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Поддерживаемые операции
Оригинал:
Supported operations
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Отношения собственности и запросов
Оригинал:
Relationships and property queries
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Тип модификаций
Оригинал:
Type modifications
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Тип преобразования
Оригинал:
Type transformations
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Характеристики типов констант
Оригинал:
Type trait constants
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
 
Defined in header <type_traits>
template< class... T >
struct common_type;
(начиная с C++11)

Определяет для всех типов T... общий тип, то есть такой тип, что все T... могут в него неявно преобразованы.

Для неспециализированной версии std::common_type правила выведения общего типа для каждой пары T1, T2 такие же, как правила определения типа возврата у тернарного условного оператора в контексте, не требующем вычисления, где первый операнд имеет тип bool, а второй и третий операнд является x-значением типов T1 и T2 (начиная с C++17) std::declval<T1>() и std::declval<T2>() (до C++17). Общий тип является результатом применения std::decay к типу, выведенном из тернарного условного оператора (начиная с C++14).

Если sizeof...(T) равно нулю или общий тип не удаётся вывести, то член type не будет определён (std::common_type является SFINAE-совместимым)

(начиная с C++17)

Содержание

[править] Тип-член

Имя Определение
type Общий тип для всех типов T...

[править] Вспомогательный тип

template< class... T >
using common_type_t = typename common_type<T...>::type;
(начиная с C++14)

[править] Специализации

Произвольные специализации std::common_type разрешены, так как минимум один аргумент может быть пользовательским типом (имейте в виду, что добавление дополнительной специализации к свойствам типам вызывает неопределённое поведение программы)

Подобные специализации уже представлены в стандартной библиотеке:

Специализируется std::common_type черта
Оригинал:
specializes the std::common_type trait
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса) [править]
Специализируется std::common_type черта
Оригинал:
specializes the std::common_type trait
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(специализация шаблона класса) [править]

[править] Возможная реализация

template <class ...T> struct common_type;
 
template <class T>
struct common_type<T> {
    typedef decay_t<T> type;
};
 
template <class T, class U>
struct common_type<T, U> {
    typedef decay_t<decltype(true ? std::declval<T>() : std::declval<U>())> type;
};
 
template <class T, class U, class... V>
struct common_type<T, U, V...> {
    typedef common_type_t<common_type_t<T, U>, V...> type;
};

[править] Примечание

Для арифметических типов, общий тип может быть рассмотрен как тип результата (возможно в смешанном режиме) арифметических выражений таких как T0() + T1() + ... + Tn().

[править] Пример

Демонстрирует выполнение арифметических действий в смешанном режиме в пользовательском классе.

#include <iostream>
#include <type_traits>
 
template <class T>
struct Number { T n; };
 
template <class T, class U>
Number<typename std::common_type<T, U>::type> operator+(const Number<T>& lhs,
                                                        const Number<U>& rhs) 
{
    return {lhs.n + rhs.n};
}
 
int main()
{
    Number<int> i1 = {1}, i2 = {2};
    Number<double> d1 = {2.3}, d2 = {3.5};
    std::cout << "i1i2: " << (i1 + i2).n << "\ni1d2: " << (i1 + d2).n << '\n'
              << "d1i2: " << (d1 + i2).n << "\nd1d2: " << (d1 + d2).n << '\n';
}

Вывод:

i1i2: 3
i1d2: 4.5
d1i2: 4.3
d1d2: 5.8