std::common_type
From Cppreference
Defined in header <type_traits>
|
||
template< class... T >
struct common_type; |
(since C++11) | |
Determines the common type among all types T..., that is the type all T... can be implicitly converted to. This is the type of the (possibly mixed-mode) arithmetic expression such as T0() + T1() + ... + Tn().
Contents |
[edit] Member types
Name | Definition |
type | the common type for all T... |
[edit] Specializations
Custom specializations of the type trait std::common_type are allowed. The following specializations are already provided by the standard library:
specializes the std::common_type trait (class template specialization) |
|
specializes the std::common_type trait (class template specialization) |
[edit] Notes
With a single template argument, std::common_type<T>::type is exactly T, which makes it the C++ equivalent of boost::identity<T>
[edit] Equivalent definition
template<class ...T> struct common_type; template<class T> struct common_type<T> { typedef T type; }; template<class T, class U> struct common_type<T, U> { typedef decltype(true ? declval<T>() : declval<U>()) type; }; template<class T, class U, class... V> struct common_type<T, U, V...> { typedef typename common_type<typename common_type<T, U>::type, V...>::type type; }; |
[edit] Example
Demonstrates mixed-mode arithmetic on a user-defined class
#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'; }
Output:
i1i2: 3 i1d2: 4.5 d1i2: 4.3 d1d2: 5.8