2013-05-29 10 views

risposta

26

È possibile raggiungere questo obiettivo con l'uso di argomenti di template variadic e compilare in tempo:

#include <type_traits> 

template <typename... Ts> 
struct largest_type; 

template <typename T> 
struct largest_type<T> 
{ 
    using type = T; 
}; 

template <typename T, typename U, typename... Ts> 
struct largest_type<T, U, Ts...> 
{ 
    using type = typename largest_type<typename std::conditional< 
      (sizeof(U) <= sizeof(T)), T, U 
     >::type, Ts... 
    >::type; 
}; 

int main() 
{ 
    static_assert(
     std::is_same<largest_type<int, char, double>::type, double>::value, ""); 
} 
+1

Yay, penso che sto iniziando a ottenere il blocco di Thi s genere di cose. +1. – chris

8

Ecco una versione che scegliere il tipo più grande, ma rompe i legami a favore di quest'ultimo tipo:

template<bool, typename, typename> 
struct pick_type; 
template<typename T, typename U> 
struct pick_type<true,T,U> { 
    typedef T type; 
}; 
template<typename T, typename U> 
struct pick_type<false,T,U> { 
    typedef U type; 
}; 

template<typename...> 
struct largest; 
template<typename T> 
struct largest<T> { 
    typedef T type; 
}; 
template<typename T, typename... U> 
struct largest<T, U...> { 
    typedef typename largest<U...>::type tailtype; 
    typedef typename pick_type< 
      (sizeof(T)>sizeof(tailtype)), 
      T, 
      tailtype 
      >::type type; 
}; 

Ecco codice di esempio:

#include <iostream> 
using namespace std; 

void foo(double) { cout << "double\n"; } 
void foo(int) { cout << "int\n"; } 
void foo(char) { cout << "char\n"; } 
void foo(bool) { cout << "bool\n"; } 
void foo(float) { cout << "float\n"; } 


int main() { 
    foo(largest<int,double,char,bool,float>::type{}); 
} 
+0

Cosa succede se la mia classe ha il tipo più grande ma non ha ancora un costruttore predefinito? – 0x499602D2

+1

@ 0x499602D2: Quindi l'esempio non funzionerebbe, ma il modello lo farebbe comunque. –

Problemi correlati