Pisanie ogólnej minimalnej funkcji, Dwa pytania przyszły mi do głowy. Kod działa poprawnie z wszelkiego rodzaju wejściowego i różnej liczbie argumentów:Ogólne min i maks. - 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
}
Czy istnieje lepszy zamiennik
decltype(a+b)
? Sądzę, że istnieje standardowa klasa, której nie pamiętam, coś w rodzajudecltype(std::THE_RESULT<a,b>::type)
.Zwrócony typ tego
decltype(std::THE_RESULT<a,b>::type)
toconst &
czy nie?
Wydaje się dziwne mi się, że pozwalasz aib być różnych typów. To otwiera drzwi do wszelkiego rodzaju bezsensownych porównań, takich jak 'min (42," trzy ")'. Dlaczego nie wymagać, aby oba parametry (i wartość zwracana) były tego samego typu? –
@AdrianMcCarthy: _ "W przypadku typów arytmetycznych typ wspólny może być również postrzegany jako typ wyrażenia arytmetycznego (prawdopodobnie w trybie mieszanym), takiego jak T0() + T1() + ... + Tn()" _. Tak więc myślę, że nie wolno używać 'min (42," trzy ")'. Powoduje błąd kompilacji. – deepmax
Nawiasem mówiąc, istnieje artykuł o odtwarzaniu dobrych części makr wersji przy użyciu szablonów. Zaskakująco wiele do zrobienia. – chris