Есть ли способ реализовать словарь типов времени компиляции через шаблоны C ++?
например если у меня есть несколько классов, подобных этим:
class ProtocolMajor1Minor2 { ... };
class ProtocolMajor4Minor3 { ... };
...
class ProtocolMajor12Minor21 { ... };
... есть ли способ использовать шаблоны C ++, которые позволили бы мне сделать что-то вроде этого:
void foo(int majorVersion, int minorVersion)
{
LookupMap<majorVersion,minorVersion>::innertype *specific =
new LookupMap<majorVersion,minorVersion>::innertype;
return specific->FunctionalityFoo();
}
В случае, если неясно, LookupMap действует так, как говорит само имя: учитывая два целочисленных параметра (старшую и младшую версии протокола), предполагается, что он обеспечивает конкретный тип протокола, который мне нужен, через «черту» innerType.
Я не могу использовать препроцессор для создания функции "foo" в качестве макроса (используя ## или #) по двум причинам: (а) она большая, не такая, как в этом примере, и я не хочу огромная функция, закодированная как макрос, и (b) сопоставления именования не являются прямыми (т. е. основная версия A и вспомогательная версия B не указывают на класс «ProtocolMajorAMinorB».
Вы также можете подумать, что «FunctionalityFoo» должен быть членом базового типа:
Вы правы, но это код, сгенерированный из устаревших генераторов кода, то есть неприкасаемый.
На самом деле существует множество функций, таких как «FunctionalityFoo», сгенерированных для каждой комбинации (главных, второстепенных), и я не хочу создавать лестницы if / then / else для каждой из них.
Я попробовал специализацию шаблонов, но не смог найти работающий синтаксис.
Есть ли способ сделать это с помощью шаблонов?