Scrivendo una funzione minima generale, mi sono venute in mente due domande. Il codice funziona bene con qualsiasi tipo di ingresso e il numero di argomento diverso:Generale min e max - C++
namespace xyz
{
template <typename T1, typename T2>
auto min(const T1 &a, const T2 &b) -> decltype(a+b)
{
return a < b ? a : b;
}
template <typename T1, typename T2, typename ... Args>
auto min(const T1 &a, const T2 &b, Args ... args) -> decltype(a+b)
{
return min(min(a, b), args...);
}
}
int main()
{
cout << xyz::min(4, 5.8f, 3, 1.8, 3, 1.1, 9) << endl;
// ^ ^ ^
// | | |
// float double int
}
Esiste un sostituto migliore per
decltype(a+b)
? Io cosa c'è una classe standard che non riesco a ricordare, qualcosa comedecltype(std::THE_RESULT<a,b>::type)
.Il tipo restituito di quello
decltype(std::THE_RESULT<a,b>::type)
èconst &
oppure no?
Sembra strano a me che si consente a e b per essere diversi tipi. Questo apre la porta a tutti i tipi di confronti privi di senso, come 'min (42," three ")'. Perché non richiedere che entrambi i parametri (e il valore restituito) siano tutti dello stesso tipo? –
@AdrianMcCarthy: _ "Per i tipi aritmetici, il tipo comune può anche essere visualizzato come il tipo di un'espressione aritmetica (possibilmente in modalità mista) come T0() + T1() + ... + Tn()" _. Quindi penso che sia proibito usare 'min (42," three ")'. Rende l'errore di compilazione. – deepmax
A proposito, c'è un articolo sulla riproduzione delle parti buone delle versioni macro usando i template. È sorprendentemente molto da fare. – chris