#include <iostream>


template <typename LeftType, typename RightType>

decltype(auto)

max(LeftType leftValue, RightType rightValue)

    {

    return leftValue < rightValue ? rightValue : leftValue;

    }


template <typename LeftType, typename... RestTypes>

decltype(auto)

max(LeftType leftValue, RestTypes... restValues)

    {

    auto rightValue = max(restValues...);

    return leftValue < rightValue ? rightValue : leftValue;

    }


int main()

    {

    std::cout << ::max(1,  2,  3.0, -1.2, 'c', 12ull) << std::endl;

    std::cout << ::max(30, 1, -0.2,  'a', 5.4, 102  ) << std::endl;

 

    return 0;

    }