Я строю систему, в которой математические вычисления описываются как граф. Каждый узел графа является либо очень простой функцией (например, x -> x^2
), которая «удваивается в удвоении», либо это произвольные сложные функции с возможными не примитивными типами данных. Структура графа и все его элементы известны во время компиляции, и структура не изменится во время выполнения.
Текущий порядок выполнения программы внутри main()
выглядит следующим образом: Все узлы инициализируются как объекты, они связаны друг с другом с помощью (специальной) функции connect()
, первые узлы активируются вручную и дальнейшие вычисления имеет место.
Проблема, с которой я сталкиваюсь, - это часть программы, в которой я передаю результат одного узла его дочерним элементам.
Сначала я отправляю void*
результата потомков, а затем статически преобразую его в правильный тип данных внутри потомка. Мысль на этот счет, что за void*
всегда будет скрыт правильный тип данных, потому что я ранее проверил, являются ли два узла «соединяемыми». Оказалось, что программа работала (в режиме сборки), но в режиме выпуска не компилировалась вообще. (В настоящее время я думаю, что мог бы использовать reinterpret_cast
, чтобы избежать проблемы с выпуском, но все же я не гордился этим кодом.)
Моя вторая попытка заключалась в использовании внешней функции под названием friend void propagate(...)
, которая была вызывается изнутри конкретного узла. Я ограничил себя передачей любых типов данных, так как в первой попытке использовался только double
, std::vector<double>
, а позже, возможно, матрица. Внутри propagate()
я использую простую справочную таблицу вместе с переключателем, чтобы решить, какую из (для выбранного типа данных) специализированных функций передачи следует вызвать. Эта попытка работает хорошо, и код намного чище, но я ограничен этими типами данных. Даже для простого bool
в качестве параметра мне нужно было бы сделать все это каким-то образом шаблоном или скопировать код.
В дальнейших исследованиях я нашел ключевые слова, поскольку программирование потока данных, реактивное ... еще далеко не продвинулось.
Что ж, надеюсь, я смогу прояснить свою борьбу. Я не разделяю свой код, потому что я думаю, что у всего моего решения есть недостатки, я открыт, чтобы услышать лучшие подходы, которые приведут меня к реализации системы в масштабируемом и элегантном виде.
РЕДАКТИРОВАТЬ : Просто подумал, но, может быть, если я в точности хочу описать такое поведение, как описано, без использования наследования или шаблонов, может быть, мне нужно использовать какой-нибудь динамический c типизированный язык, такой как Python
, чтобы упростить передачу данных?