#pragma once #include #include #include template [[nodiscard]] auto geomean(It begin, It end, Op op) -> double { double sum = 0.0; size_t count = 0; while (begin != end) { sum += std::log(op(*begin)); ++begin; ++count; } sum /= static_cast(count); return std::exp(sum); } template [[nodiscard]] auto geomean(Container&& c, Op op) -> double { return geomean(std::begin(c), std::end(c), std::move(op)); }