Комментарии 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 Почему не указываешь язык в блоках кода?
Это случаем не перезалив? Есть такое ощущение, что когда-то я эту статью уже читал.
Могу ошибаться
Где же там runtime dispatch, если AnyProcessor использует виртуальные функции?
Отличный разбор возможностей метапрограммирования. Что характерно, даже полезных его компонентов.
Увы, здесь нет ответа но поставленный самим же автором вопрос - а что делает это все нужным? Как мы смогли в архразборе смешать в кучу virtual (динамический полиформизм открытого мира), concept (статический полиморфизм открытого мира) и TypeErasure (специфический способ порождения полиморфмных значений), ведь последний находится в другой логической категории - это адаптер, а не декларация.
Кроме того, для любой схемы нужно указывать не только реализацию и плюсы, но и минусы. У TypeErasure они бывают очень неприятные, именно из-за того, что это адаптер: скажем, гарантирует ли std::function, что if (x) x(); не бросит bad_function_call? А если нулевой function<int()> перевернут в function<void()>?



Шаблоны C++ как инструмент архитектуры: compile-time dispatch, type traits и type erasure