std::common_type
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. For non-specialized std::common_type, the rules for determining the common type between every pair T1, T2 are exactly the rules for determining the return type of the ternary conditional operator where T1 and T2 are the types of its second and the third operands. For arithmetic types, this may also be viewed 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] Possible implementation
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