After looking into defining a view interface, I decided to use range-v3.
There are several things missing from std::ranges https://stackoverflow.com/a/68172842/11998382, and until they are added in future standards, it is sensible to use range-v3 rather than repeatedly attempting non-trivial implementations yourself.
solved Access index of current element in range-for loop c++20