common_type-Klasse
Bestimmt den allgemeinen Typ mindestens eines Typs.
Syntax
template <class... T>
struct common_type;
template <class T>
struct common_type<T> {
typedef typename decay<T>::type type;
};
template <class T, class U>
struct common_type<T, U> {
typedef typename decay<decltype(true declval<T>() :
declval<U>())>::type 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;
};
Parameter
Liste mit Typen, die entweder vollständige Typen oder leer sind.
Hinweise
Der type
-Member ist der allgemeine Typ, in den alle Typen in der Parameterliste konvertiert werden können.
Beispiel
Mit dem folgenden Programm werden einige richtige Verwendungsszenarios und Tests für Ergebnisse veranschaulicht.
// Compile using cl.exe /EHsc
// common_type sample
#include <iostream>
#include <type_traits>
struct Base {};
struct Derived : Base {};
int main()
{
typedef std::common_type<unsigned char, short, int>::type NumericType;
typedef std::common_type<float, double>::type FloatType;
typedef std::common_type<const int, volatile int>::type ModifiedIntType;
typedef std::common_type<Base, Derived>::type ClassType;
std::cout << std::boolalpha;
std::cout << "Test for typedefs of common_type int" << std::endl;
std::cout << "NumericType: " << std::is_same<int, NumericType>::value << std::endl;
std::cout << "FloatType: " << std::is_same<int, FloatType>::value << std::endl;
std::cout << "ModifiedIntType: " << std::is_same<int, ModifiedIntType>::value << std::endl;
std::cout << "ClassType: " << std::is_same<int, ClassType>::value << std::endl;
std::cout << "---------------------------" << std::endl;
std::cout << "Test for typedefs of common_type double" << std::endl;
std::cout << "NumericType: " << std::is_same<double, NumericType>::value << std::endl;
std::cout << "FloatType: " << std::is_same<double, FloatType>::value << std::endl;
std::cout << "ModifiedIntType: " << std::is_same<double, ModifiedIntType>::value << std::endl;
std::cout << "ClassType: " << std::is_same<double, ClassType>::value << std::endl;
std::cout << "---------------------------" << std::endl;
std::cout << "Test for typedefs of common_type Base" << std::endl;
std::cout << "NumericType: " << std::is_same<Base, NumericType>::value << std::endl;
std::cout << "FloatType: " << std::is_same<Base, FloatType>::value << std::endl;
std::cout << "ModifiedIntType: " << std::is_same<Base, ModifiedIntType>::value << std::endl;
std::cout << "ClassType: " << std::is_same<Base, ClassType>::value << std::endl;
return 0;
}
Output
Test for typedefs of common_type int
NumericType: true
FloatType: false
ModifiedIntType: true
ClassType: false
---------------------------
Test for typedefs of common_type double
NumericType: false
FloatType: true
ModifiedIntType: false
ClassType: false
---------------------------
Test for typedefs of common_type Base
NumericType: false
FloatType: false
ModifiedIntType: false
ClassType: true
Anforderungen
Header:<type_traits>
Namespace: std