std::common_type

From Cppreference

Jump to: navigation, search
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

[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