#include <type_traits>

template <typename T>

double average_so(T a[], int count)

{

    typedef typename std::conditional<sizeof(T) >= sizeof(float), T, int>::type _T;

    _T remainder = 0;

    _T avg = 0;

    _T divisor = _T(count);

    for(int i = 0; i < count; ++i)

    {

        _T v, vv;

        avg += v = a[i] / divisor;

        vv = v * divisor;

        remainder += a[i] - vv;

    }

    return avg + double(remainder) / divisor;

}


* 주의: std::conditional은 C++11 확장임.