This is clearly stupendously clever.
What I don't understand is what specific thing is linking the bound Allocator type in the injector to the specialisation point in the app's constructor. Is it this: template<class TAllocator = class Allocator> ?
This is going to need to be meticulously documented and spelled out in small words for people like me who obviously live in your intellectual shadow.
Yeah, templates are bound by default types names (notice that it also allow
concepts - AllocatorConcept = class Allocator) whilst constructor
parameters are deduced.
Firstly, types are rebound and then proper constructor parameters are
being injected. If anything is missing in the wiring compilation error will
be triggered.
template<class TAllocator = class Allocator>
auto injector = di::make_injector(
di::bind<class Allocator>.to