#include <iostream>
#include <type_traits>
template<typename T1, typename T2>
auto max(T1 t1, T2 t2) {
return t1<t2?t2:t1;
}
template<typename T1, typename T2>
auto max1(T1 t1, T2 t2)->typename std::decay<decltype(true?t2:t1)>::type {
return t1<t2?t2:t1;
}
template<typename T1, typename T2>
auto max2(T1 t1, T2 t2)->decltype(true?t2:t1) {
return t1<t2?t2:t1;
}
template<typename T1, typename T2>
std::common_type<T1, T2> max3(T1 t1, T2 t2) {
return t1<t2?t2:t1;
}
void Test(){
std::cout<<std::boolalpha<<std::is_same_v<decltype(max(4, 7.2)), double><<std::endl;
std::cout<<std::boolalpha<<std::is_same_v<decltype(max(7.2, 4)), double><<std::endl;
double a = 7.2;
double &b = a;
int c = 4;
std::cout<<std::boolalpha<<std::is_reference_v<double&><<std::endl;
std::cout<<std::boolalpha<<std::is_same_v<decltype(max2(b,c)), double><<std::endl;
std::cout<<std::boolalpha<<std::is_reference_v<decltype(max2(b,c))><<std::endl;
}
int main()
{
Test();
}