Your code is OK, already satisfies "minimum friction" as you say.
The tiny changes I had in mind when reading the PR:
1/ "const UnitStats max = _soldier->getRules()->getStatCaps();"
Here, we make an unnecessary copy of a read-only field. I wanted to change it to "const UnitStats& max", but I see now that RuleSoldier class doesn't actually have a method that returns a const reference. I'll add such methods and refactor code later. So, you didn't make any mistake here.
2/ "typedef UnitStats::Type Type;"
I don't like anything that's called just "Type". I will either give it a less generic name, or probably just remove it completely. But that's just a personal preference.
3/ "Text *number"
Even though we have all three kinds of formatting in the code (T* x, T *x and T * x), the preferred one is "Text* number" and should be used in all newly written code.
PS: rewriting using lambda makes sense in this case and is welcome. OXC still dwells on keeping the C++03 compatibility (to support old and rare hardware/OS), but we don't share this sentiment in OXCE. The primary goal of OXCE is to bring Xcom to
new hardware/OS. OXC (and unfortunately still also OXCE) has serious issues running on newer Macs and newer Linux distros, we've became "too old" ourselves. Hopefully we'll be able to upgrade before someone starts the OpenOpenXcom project
FYI, OXCE currently supports C++17 and we'll allow C++20 probably sometime in 2024.