в чем суть.
есть сканнеры
template <>
struct scanner<my_type> {
static constexpr auto pattern(std::string_view params) {
return "pattern";
}
template <typename Context>
struct state {
Context context;
};
template <typename Context>
static constexpr state<Context> begin(std::string_view params, Context context) {
return state{std::move(context)};
}
// .. статик методы которые используют контекст
};
и есть вызов их
struct a {
my_type obj1;
my_type obj2;
};
struct b {
a obj;
std::string_view str;
};
auto result = scan::scan<"{} {}">("patternpattern str").of<b>();
и нужно научить пробрасывать этот контекст в сканнеры.
auto result = scan::scan<"{} {}">("patternpattern str").of<b>({{42, "hello world"}, scan::by_default{}});
как видно сканнеры могут быть шаблонные и стейт который там есть тоже. но нужен удобный апи через {} а не мусор.
делать такой апи нормально шаблонами не выйдет в целом. его вроде можно сделать руками для конкретного типа (нельзя на самом деле нормально) и типа куда сканируется но обобщить это шаблонами не выйдет - пришлось бы генерировать шаблонные функции шаблонами в типе. так делать нельзя.
но решение и путь сделать такой апи есть. благодаря правилу что объект живет до окончания полного выраженияя все что пользователь в of насоздает будет жить до тех пор. это можно сделать и внутри of сделать стирание типа прямо на границе через шаблонные конструкторы. и все операции которые делаются со стейтом будут уже со стертым типом
это со стиранием накладывает свои ограничения вроде того что нельзя бранчиться по тому будет ли перегрузка вообще или нет в зависимости от того какой там шаблонным тип (а там в зависимости от того есть ли перегрузка меняется поведение и то какой автомат вообще строится).