std::common_type
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) равно нулю или общий тип не удаётся вывести, то член |
(начиная с 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