Daily bit(e) of C++ #194, Утилита C++20 для вычисления средней точки между двумя арифметическими типами или указателями: std::midpoint.

Вычисление среднего значения между двумя арифметическими типами или указателями может показаться тривиальным; однако, когда значения близки к числовым пределам или не соответствуют порядку, тривиальные реализации могут легко столкнуться с неопределенностью поведения.

C++20 представил std::midpoint, обеспечивающий безопасную реализацию.

#include <numeric>


auto m1 = std::midpoint(std::numeric_limits<int>::max(),
    std::numeric_limits<int>::max()-2);
// m1 == std::numeric_limits<int>::max()-1

int data[]={5, 9, 2, 3, 1, 8, 4, 6, 7};
auto m2 = std::midpoint(data, data+9);
// *m2 == 1

auto m3 = std::midpoint(3.2, 7.6);
// m3 ~= 5.4

Откройте пример в Compiler Explorer.