Например, есть шаблонный класс, например
template<int nd>
class foo_t{
...
};
class foo_holder : public std::variant<foo_t<1>, foo_t<2>>{
...
template<int nd>
operator foo_t<nd>& () const {
return std::get<foo_t<nd>>(*this);
}
};
И, например, есть шаблонная функция, принимающая этот шаблонный класс и в то же время параметризуемая ещё какими-то параметрами
template<int nd, int flag>
void proc_foo_f(foo_t<nd>&)
void proc_foo(foo_holder& foo, int a, int b){
int nd=foo.index()+1
switch (nd) {
case 1: switch (flag) {
case FLAG1: return proc_foo_f<1,1>(foo);
case FLAG2: return proc_foo_f<1,2>(foo);
...
}
case 2: switch (flag) {
case FLAG1: return proc_foo_f<2,1>(foo);
case FLAG2: return proc_foo_f<2,2>(foo);
...
}
}
}
Думал сделать это ввиде виртуального класса-функтора, но как-то это тоже коряво, тем более для каждого инстанса его надо не только писать, но ещё и называть как-то. Как такую семантику делать правильно?