Олд скул. Мова C, можна і в плюсах (не рекомендовано):
#define max(a,b) (((a)>(b))?(a):(b))
Проблеми: якщо має повертати значення - обмеження одним виразом, жодного контролю типів, подвійне обчислення аргументів, наприклад, max(a++, b++) збільшить більше число на два.
C++ до C++20:
template<typename T>
T max(T a, T b)
{
  if(a>b)
    return a;
  else
    return b;
}
C++20 надає скорочену форму попереднього виразу через auto:
auto max(auto a, auto b)
{
  if(a>b)
    return a;
  else
    return b;
}
означає абсолютно те саме, що й попередній код.
Так, а тепер ще раз: чому ви хочете "обійтись без цього auto"?