Я сталкиваюсь с проблемой, в которой мне нужно сгенерировать огромное количество кода, все это довольно похоже, и я хочу знать, есть ли какой-нибудь способ шаблонизации.
Допустим, у меня есть структура этого типа
template <typename ...NodeKindTs>
struct Element{
std::tuple<NodeKindTs...> nodes;
}
У меня есть вектор целых, который связывает один узел с другим, и вектор перечисления, который говорит, какой тип узлакаждый.Тип может быть A, B или C.
enum class Kind {A,B,C};
std::vector<int> relationShip;
std::vector<Kind> kind;
Например, если у меня есть
relationShip = {1,2,-1};
kind = {A,B,A}
, это будет означать, что первый узел имеет тип A и связан со вторымузел, который имеет вид B. Вы получаете это.
Теперь я должен создать Элементы и вставить их в вектор, в зависимости от NodeKind, который доставляет каждый узел и отношение.Эти элементы шаблонируются до 6 видов узлов.Для решения этой задачи мне нужно огромное значение, которое проверяет Kind каждого узла, а затем вызывает ctor элемента.
Для случая с 2 NodeKinds это означает выполнение чего-то вроде
if (node1.type == A && node2.type == A) {
auto &simNode1 = containerOfAs(node1.id);
auto &smiNode2 = containerOfAs(node2.id);
insertElement(elementFactory(simNode1, simNode2));
}
if (node1.type == A && node2.type == C)
{
auto &simNode1 = containerOfAs(node1.id);
auto &smiNode2 = containerOfCs(node2.id);
insertElement(elementFactory(simNode1, simNode2));
}
if (node1.type == B && node2.type == C)
{
auto &simNode1 = containerOfBs(node1.id);
auto &smiNode2 = containerOfCs(node2.id);
insertElement(elementFactory(simNode1, simNode2));
}
...
insertElementэто мета-функция, которую я создал, которая вставляет элемент в контейнер, если подходит из списка контейнеров.
Для этого 2 случая требуется до 9 ifs.Для случая 3 требуется 27 ifs, а для случая 6 - 729 if.Я действительно не хочу их кодировать.
Есть идеи, как мне это решить?
Спасибо!