Обновить

Комментарии 9

Код AnyProcessor::Model становится немного короче если использовать часто незаслуженно забываемое множественное наследование:

  template <typename Processor>
  struct Model final : Concept, Processor {
    explicit Model(Processor&& processor) : Processor(std::move(processor)) {}

    void process(double value) override { Processor::process(value); }
  };

@matweu Почему не указываешь язык в блоках кода?

Привет! Если честно, не видел на хабре, чтобы можно было это сделать, при написании статей всегда вставляю как блок кода, подсветите как это сделать, был бы очень признателен. Спасибо!

В блоке кода можно указать язык

Не указан - нет раскраски
Не указан - нет раскраски
Указан - есть раскраска
Указан - есть раскраска

И ломается на final классах

Это случаем не перезалив? Есть такое ощущение, что когда-то я эту статью уже читал.

Могу ошибаться

Привет! Нет, раньше не писал об этом.

Где же там runtime dispatch, если AnyProcessor использует виртуальные функции?

это и есть "runtime dispath"

Отличный разбор возможностей метапрограммирования. Что характерно, даже полезных его компонентов.

Увы, здесь нет ответа но поставленный самим же автором вопрос - а что делает это все нужным? Как мы смогли в архразборе смешать в кучу virtual (динамический полиформизм открытого мира), concept (статический полиморфизм открытого мира) и TypeErasure (специфический способ порождения полиморфмных значений), ведь последний находится в другой логической категории - это адаптер, а не декларация.

Кроме того, для любой схемы нужно указывать не только реализацию и плюсы, но и минусы. У TypeErasure они бывают очень неприятные, именно из-за того, что это адаптер: скажем, гарантирует ли std::function, что if (x) x(); не бросит bad_function_call? А если нулевой function<int()> перевернут в function<void()>?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации