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