struct Maxf{
template <typename T>static const T f(const T& a, const T& b){return a>b?a:b;}
};
struct Minf{
template <typename T>static const T f(const T& a, const T& b){return a<b?a:b;}
};

template<class M,typename T >struct Func
{
static const T f(const T* p, int n)
{
T m = p[0];
for(int i = 1 ; i < n ; i++){ m = M::f(m,p[i]);}
return m;
}
};

double a[]={-2,3.14,2.2369,0.};
double maxv = Func<Maxf>::f(a, sizeof(a)/sizeof(a[0]) );

書いといてなんだが、見やすい見にくいの問題なら個人の感想なので好きなようにどうぞとしか