Передача данных внутри программы потока данных - PullRequest
0 голосов
/ 02 марта 2020

Я строю систему, в которой математические вычисления описываются как граф. Каждый узел графа является либо очень простой функцией (например, x -> x^2), которая «удваивается в удвоении», либо это произвольные сложные функции с возможными не примитивными типами данных. Структура графа и все его элементы известны во время компиляции, и структура не изменится во время выполнения.

Текущий порядок выполнения программы внутри main() выглядит следующим образом: Все узлы инициализируются как объекты, они связаны друг с другом с помощью (специальной) функции connect(), первые узлы активируются вручную и дальнейшие вычисления имеет место.

Проблема, с которой я сталкиваюсь, - это часть программы, в которой я передаю результат одного узла его дочерним элементам.

Сначала я отправляю void* результата потомков, а затем статически преобразую его в правильный тип данных внутри потомка. Мысль на этот счет, что за void* всегда будет скрыт правильный тип данных, потому что я ранее проверил, являются ли два узла «соединяемыми». Оказалось, что программа работала (в режиме сборки), но в режиме выпуска не компилировалась вообще. (В настоящее время я думаю, что мог бы использовать reinterpret_cast, чтобы избежать проблемы с выпуском, но все же я не гордился этим кодом.)

Моя вторая попытка заключалась в использовании внешней функции под названием friend void propagate(...), которая была вызывается изнутри конкретного узла. Я ограничил себя передачей любых типов данных, так как в первой попытке использовался только double, std::vector<double>, а позже, возможно, матрица. Внутри propagate() я использую простую справочную таблицу вместе с переключателем, чтобы решить, какую из (для выбранного типа данных) специализированных функций передачи следует вызвать. Эта попытка работает хорошо, и код намного чище, но я ограничен этими типами данных. Даже для простого bool в качестве параметра мне нужно было бы сделать все это каким-то образом шаблоном или скопировать код.

В дальнейших исследованиях я нашел ключевые слова, поскольку программирование потока данных, реактивное ... еще далеко не продвинулось.

Что ж, надеюсь, я смогу прояснить свою борьбу. Я не разделяю свой код, потому что я думаю, что у всего моего решения есть недостатки, я открыт, чтобы услышать лучшие подходы, которые приведут меня к реализации системы в масштабируемом и элегантном виде.

РЕДАКТИРОВАТЬ : Просто подумал, но, может быть, если я в точности хочу описать такое поведение, как описано, без использования наследования или шаблонов, может быть, мне нужно использовать какой-нибудь динамический c типизированный язык, такой как Python, чтобы упростить передачу данных?

...