Если вы отслеживаете мою историю вопроса, я обновляю библиотеку пространственного анализа ради того, чтобы качать кошмар макросов и изучать C++ 11, вариативные шаблоны, и метапрограммирование и парадигмы функционального программирования. Для моей жизни это все еще волшебство.Попытка суммировать две последовательности целочисленного набора времени компиляции
Во всяком случае, у меня есть кортежи констант экспоненты, которые определяют физические единицы.
template<int... I>
using make_dimension = std::tuple<std::ratio<I>...>;
using scalar_dimension = make_dimension<0, 0, 0, 0, 0, 0, 0>;
using length_dimension = make_dimension<1, 0, 0, 0, 0, 0, 0>;
using time_dimension = make_dimension<0, 0, 1, 0, 0, 0, 0>;
Это (часть) библиотеки, которая моделирует единицы СИ. Вы можете умножать только единицы, в отличие от единиц, вы можете дополнительно добавить единицы и скаляры. Эти библиотеки денди в том, что они вызывают ошибки во время компиляции, если вы неправильно смешиваете блоки. Есть> 400 единиц, и большинство из них определяются с точки зрения других единиц. При умножении единиц измерения экспоненты добавляются, а при разделении единиц экспоненты вычитаются. Таким образом, чтобы определить скорость, я хотел бы средством выражения:
using velocity_dimension = divide_dimensions<length_dimension, time_dimension>;
И это должно быть функционально эквивалентно записи:
using velocity_dimension = make_dimension<1, 0, -1, 0, 0, 0, 0>;
Я погуглить, но я просто не знаю, терминология, чтобы приземлить некоторые хиты. Самое близкое, что я нашел, - это for_each, который применяет функцию к элементам кортежа во время выполнения ... И это как бы раздувает мой разум, поэтому я не могу понять, как превратить его в итерацию времени компиляции элементы. «make_dimension» выше было объяснено мне минуту назад, и это взорвало мой разум, но я выздоровел. Я как бы прошу просить раздаточный материал, и у кого-нибудь есть хорошие ресурсы для изучения этого материала? Я с трудом верю, что я единственный, кто очень заинтересован в этом.
Принимали ли вы посмотрите на [ 'boost.units' библиотеки] (Http: //www.boost. орг/док/ЛИЭС/1_56_0/DOC/HTML/boost_units.html)? – dyp
* «Вы можете размножать только разные единицы» * Итак, нет м², нет m/s² и т. Д.? Зачем? – dyp
Вот краткий пример преобразования для пары кортежей: http://coliru.stacked-crooked.com/a/e5f03a72538ce8c5 Поскольку это базовая функция для списков типов, вы найдете некоторую реализацию во многих библиотеках TMP.Интерфейс, который я использовал в моем примере, довольно неудобен (но он прекрасно сочетается с 'std :: ratio_add'); Я бы предложил вам попробовать использовать 'constexpr' функции. – dyp