EP>Код со статическим/параметрическим полиморфизмом зачастую получается не только быстрее, но и проще. Несколько раз упомянутый тобой CRTP используется только в некоторых специфических случаях, в то время как для статического полиморфизма зачастую достаточно обыкновенной перегрузки, которая очевидно проще чем виртуальные вызовы и прочие индерекции, плюс value-semantic автоматически сохраняется (её можно получить и для динамического полиморфизма, но для этого требуется много движений).
EP>Например попробуй переписать partition_point через динамический полиморфизм, и мы сравним:
EP>EP>template<typename I, typename P>
EP>I partition_point(I first, I last, P p)
EP>{
EP> while(first != last)
EP> {
EP> I middle = next(first, distance(first, last)/2);
EP> if( p(*middle) )
EP> last = middle;
EP> else
EP> first = next(middle);
EP> }
EP> return first;
EP>}
EP>
Я не утверждал что кругом нужно лепить динамический полиморфизм. Как раз наоборот, там где шаблоны позволяют упростить код, следует именно их и использовать.
EP>Ошибка какого рода? Не добавляет скорости или "производительность в базу упирается"?
Ложное целеполагание. Некоторые считают что с помощью шаблонов можно получить более быстрый код, но по факту, никто ведь не сравнивает обычно и очень часто компилятор может оптимизировать код без шаблонов не хуже.