@odessa_virtual меня посетила идейка. По сути всё что нам нужно это субтайпинг.
Т.е. мы в каком-то месте программы сделали список расширений. let ctx = Context<Hlist![e1, e2, e3, e4]>::init();
В другом месте от нас требуется такая херня: foo(&ctx: C) where C = E1 + E3;
Соответсвенно нам нужно доказать конпиляторы что елементы находятся в списке.
Один вариант это перенести доказательство в определения функции foo тогда будет но не очень удобно.
Другой вариант это перенести доказательство в место вызова.
и тогда будет примерно то что Путешественник сделал.
просто в момент init() задаем порядок елементов как я сделал в ConstIndexDef варианте только лучше. Получается индексы в любой момент воводятся сами. Поэтому билдер или context можно носить по функциям в обобщемнном виде сколько хочешь. Просто в нужный момент делаем создаем специальную структура которая хранит выведденные индексы.