Difference between revisions of "User:Lerom"
Line 1: | Line 1: | ||
{{DEFAULTSORT:Lerom}} | {{DEFAULTSORT:Lerom}} | ||
− | <big><syntaxhighlight lang="cpp"> | + | <big><big><syntaxhighlight lang="cpp"> |
template <typename T> | template <typename T> | ||
inline void callWithMax(const T& a, const T& b) // Поскольку мы не знаем, | inline void callWithMax(const T& a, const T& b) // Поскольку мы не знаем, | ||
{ // что есть T, то передаем | { // что есть T, то передаем | ||
− | f(a > b ? a : b); | + | f(a > b ? a : b); // его по ссылке на const - |
} // см. параграф 20 | } // см. параграф 20 | ||
− | </syntaxhighlight></big> | + | </syntaxhighlight></big></big> |
+ | |||
+ | Этот шаблон генерирует целое семейство функций, каждая из которых принимает два аргумента одного и того же типа и вызывает f с наибольшим из них. Нет необходимости заключать параметры в скобки внутри тела функции, не нужно заботиться о многократном вычислении параметров и т. д. Более того, поскольку callWithMax – настоящая функция, на нее распространяются правила областей действия и контроля доступа. Например, можно говорить о встроенной функции, являющейся закрытым членом класса. Описать нечто подобное с помощью макроса невозможно. | ||
+ | Наличие const, enum и inline резко снижает потребность в препроцессоре (особенно это относится к #define), но не устраняет ее полностью. Директива #include остается существенной, а #ifdef/#ifndef продолжают играть важную роль в управлении компиляцией. Пока еще не время отказываться от препроцессора, но определенно стоит задуматься, как избавиться от него в дальнейшем. |
Latest revision as of 13:39, 5 June 2013
template <typename T>
inline void callWithMax(const T& a, const T& b) // Поскольку мы не знаем,
{ // что есть T, то передаем
f(a > b ? a : b); // его по ссылке на const -
} // см. параграф 20
Этот шаблон генерирует целое семейство функций, каждая из которых принимает два аргумента одного и того же типа и вызывает f с наибольшим из них. Нет необходимости заключать параметры в скобки внутри тела функции, не нужно заботиться о многократном вычислении параметров и т. д. Более того, поскольку callWithMax – настоящая функция, на нее распространяются правила областей действия и контроля доступа. Например, можно говорить о встроенной функции, являющейся закрытым членом класса. Описать нечто подобное с помощью макроса невозможно. Наличие const, enum и inline резко снижает потребность в препроцессоре (особенно это относится к #define), но не устраняет ее полностью. Директива #include остается существенной, а #ifdef/#ifndef продолжают играть важную роль в управлении компиляцией. Пока еще не время отказываться от препроцессора, но определенно стоит задуматься, как избавиться от него в дальнейшем.