Сложно ответить, частично потому, что я никогда не использовал (или не слышал раньше) Geant4, и частично потому, что не совсем понятно, что вы пытаетесь сделать: вы делаете библиотеку C ++ для своих коллег, чтобыиспользовать напрямую?Или вы делаете какой-то инструмент, который ваши коллеги могут использовать, не касаясь С ++?
Тем не менее, я постараюсь ответить как можно лучше.
Фундаментально, если вы хотите взятьтекстовый ввод во время выполнения и интерпретация именованных единиц, тогда вам нужна таблица сопоставления от имен единиц до определений (независимо от внутренней формы, которую принимают эти определения).На самом деле нет никакого способа обойти это.
Однако вам не обязательно создавать эту таблицу сопоставления вручную.Информация должна присутствовать в заголовочном файле Geant4, который определяет единицы измерения, чтобы вы могли написать инструмент (взломать и косую черту, как вы выразились), чтобы прочитать этот заголовочный файл и сгенерировать код для таблицы сопоставления.
Что касается поддержки новых юнитов в будущем, это может быть возможно, но я не совсем понимаю вашу проблему, чтобы предложить конкретный подход.
Хотя я немного здесь остановлюсь.Быстрый поиск в Google по Geant4 и чрезвычайно беглый поиск по первому найденному мною исходному коду приводит меня к двум соответствующим файлам: SystemOfUnits.h и G4UnitsTable.hh .
Я отмечаю, что 2 обеспечивает именно то, что вы можете захотеть отобразить в соответствии с именем, но я не знаю, как оно связано с остальной частью системы и, следовательно, является ли оно релевантным.
Если 1 является релевантным заголовком, то, очевидно, определения единиц измерения являются наиболее простыми из возможных: то есть коэффициенты масштабирования до базовых единиц.Если это так, то нет особой причины, по которой ваш файл базы данных материалов не должен также содержать определения единиц аналогичного вида (то есть загружать таблицу сопоставления из того же места, где вы загружаете определения материалов), что позволило быВаши коллеги могут добавлять новые единицы по мере необходимости.
Существует одна последняя возможность, которую я мог бы упомянуть, а именно то, что при подсчете десятичных цифр, я согласен, крайне предрасположен к ошибкам, если вы разрешаете представлять значения в научныхобозначения тогда большая часть этой проблемы уходит.Поэтому, возможно, самое простое решение - попросить ваших коллег использовать базовые единицы Geant4, и если они хотят указать значение, скажем, 5 км, они должны указать его как 5e6 (поскольку базовая единица Geant4 для длины - это миллиметр).согласно 1 ).