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{});
}
fonte
2013-05-29 01:07:18
Yay, penso che sto iniziando a ottenere il blocco di Thi s genere di cose. +1. – chris