2013-05-29 7 views
25

मैं एक क्लास टेम्पलेट कैसे बनाऊंगा जो उस प्रकार को लौटाएगा जिसका sizeof दूसरों की तुलना में अधिक है। उदाहरण के लिए:मैं प्रकारों की सूची में सबसे बड़ा प्रकार कैसे वापस कर सकता हूं?

typename largest<int, char, double>::type; 

double लौट चाहिए। मुझसे यह कैसे होगा?

उत्तर

26

आप variadic टेम्पलेट तर्क के उपयोग के साथ यह पूरा कर सकते हैं और संकलन समय सशर्त:

#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, मुझे लगता है कि मैं थी की लटका पाने के लिए शुरू कर सामान की तरह। +1। – chris

8

यहाँ एक संस्करण है कि सबसे बड़ा प्रकार ले जाएगा है, लेकिन पिछले प्रकार के पक्ष में संबंधों टूट जाता है:

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; 
}; 

यहाँ उदाहरण कोड है:

#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

क्या होगा यदि मेरी कक्षा का सबसे बड़ा प्रकार था लेकिन फिर भी कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं था? – 0x499602D2

+1

@ 0x499602D2: फिर उदाहरण काम नहीं करेगा, लेकिन टेम्पलेट अभी भी होगा। –

संबंधित मुद्दे