Re: ненормальные нормальные алгорифмы
От: rg45 СССР  
Дата: 02.05.26 09:19
Оценка: 37 (1)
Здравствуйте, Кодт, Вы писали:

К>Понятное дело, что это извращения с кодом, и вообще, когда допилю, (надеюсь, к Дню Программиста), сделаю статью на хабре.

К>Но сейчас мне просто нужна обратная связь по коду.

template<Rule auto... ps> struct rules {
    REPRESENTS(Rule)

    constexpr RuleOutput auto operator()(RuleInput auto t) const {
        return (not_matched_yet{t} >> ... >> ps);
    }
};


Вот в этом месте я бы не поленился и рядом с шаблоном класса, определил бы ещё и шаблон объекта класса:

template<Rule auto... ps> struct Rules {
   // . . . 
};
template <Rule auto... ps> constexpr Rules<ps...> rules.


Тогда при использовании rules можно будет убрать мозолящие глаза пустые фигурные скобки (инициализаторы).

А в нешаблонных классах имя класса можно и вовсе опускать:

struct {
   // Здесь функциональные операторы - сколько угодно и какие угодно.
} inline constexpr foo;


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

На основе одного шаблонного класса можно определить несколько шаблонов объектов класса со специальными именами, и тем самым избавиться от макросов. Как по мне, необходимости в этих макросах нет совсем, они только портят пейзаж.

template<Str auto s, Str auto r, rule_state_t state> struct Rule {
// . . .
};
template<Str auto s, Str auto r> constexpr Rule<s, r, regular_state> rule;
template<Str auto s, Str auto r> constexpr Rule<s, r, final_state> final_rule;


P.S. Вообще подход полезный, как альтернатива традиционному рантайм полиморфизму — для декомпозиции и структурирования кода, для разложения сложных задач на более простые подзадачи и стратегии. Это потом легко мокается и покрывается юнит тестами.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 02.05.2026 10:35 rg45 . Предыдущая версия . Еще …
Отредактировано 02.05.2026 10:23 rg45 . Предыдущая версия .
Отредактировано 02.05.2026 10:23 rg45 . Предыдущая версия .
Отредактировано 02.05.2026 10:22 rg45 . Предыдущая версия .
Отредактировано 02.05.2026 10:03 rg45 . Предыдущая версия .
Отредактировано 02.05.2026 9:56 rg45 . Предыдущая версия .
Отредактировано 02.05.2026 9:39 rg45 . Предыдущая версия .
Отредактировано 02.05.2026 9:20 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.