Pull to refresh

Comments 11

Смотрим… Работает!

Вообще-то не работает.

Получаем некорректный результат, и ни одного предупреждения

А какие предупреждения вы ожидали? О переполнении? Но тогда даже без шаблонов вы его вряд ли увидите.

Кроме того ваша реализация факториала не отличается от вашей реализации арифметической прогрессии, так что даже без переполнения результат будет неправильным.

Мы получаем наследуемые inline методы с полиморфным поведением!

Вы так подчеркиваете, то что они inline, это существенно? Кстати, в данном случае inline писать совсем не обязательно, потому что функции определенные внутри класса автоматически являются inline.
Да, вы правы, поправил.

Мы получаем наследуемые inline методы с полиморфным поведением!

Вы так подчеркиваете, то что они inline, это существенно?


Существенно то, что компилятор сделает их встроенными
Мы получаем наследуемые inline методы с полиморфным поведением!
Вы так подчеркиваете, то что они inline, это существенно?
Существенно то, что компилятор сделает их встроенными
Переформулирую вопрос, а почему это существенно? Если вы думаете, что он подставит их тело вместо вызова, то он этого может и не сделать.
Да, вы правы, поправил.
Факториал все еще не факториал, а арифметическая прогрессия по сути просто умножение двух чисел, это конечно тоже арифметическая прогрессия, но пример не показательный, того же эффекта можно достигнуть просто перемножив числа.
UFO just landed and posted this here
Специализация — это повторное определение шаблона с конкретным типом либо классом типов:

И дальше вы показываете «специализацию» функций.

Но у функций в C++ нет частичных специализаций. Есть только полная специализация и перегрузка. Частичная специализация может быть только у шаблонов классов. Функции выбираются не на основе правил специализации, а на основе правил перегрузки, что часто может вести к неожиданным последствиям.
Рекомендую почитать www.gotw.ca/publications/mill17.htm
даже для эквивалентных типов — unsigned char & char
С каких пор они эквивалентные?
UFO just landed and posted this here
Третья подряд некачественная статья от автора. Предлагаю сообществу поактивнее самомодерироваться.
Насколько я могу судить, здесь не происходит никаких вычислений в compile-time: всего лишь генерируется много функций func<12>, func<11>, ..., func<0>, а время выполнения (как и объем используемой памяти) линейно — мы должны все эти функции вызвать.
Вычисления времени компиляции можно использовать несколько иначе:
template<int n>
struct IntegersSum
{
  enum { sum = IntegersSum<n - 1>::sum + n };
};

template<>
struct IntegersSum<0>
{
  enum { sum = 0 };
};
Если использовать C++11, это можно вообще без шаблонов в constexpr посчитать.
Sign up to leave a comment.

Articles