Я только что нашел это функциональное определение в некотором встроенном коде:
float round_float_to_4(static float inputval);
Я знаком с другим использованием для статического (глобальные переменные, функции и локальные переменные), но это - первый раз, когда я рассматриваю его как спецификатор для параметра функции. Я предполагаю, что это вынуждает компилятор использовать местоположение постоянной памяти для inputval вместо стека?
Это нестандартно. Я бы предположил то же самое, что и вы, и меня не удивляет такое расширение в компиляторах, имеющих встроенную цель.
Это неверно. Единственное допустимое место, где static
может использоваться в параметре функции, о котором я знаю, - это измерение массива
float round_float_to_4(float inputval[static 4]);
. Говоря, что inputval
будет во всех вызовах этой функции, указывает на память, обеспечивающую не менее 4
чисел с плавающей запятой (это добавление C99, его нет в C89).
Для решения этой проблемы можно использовать boost:: shared _ ptr . В конструкторе можно передать пользовательскую функцию подчистки, которая может быть startObject-Method библиотеки, создавшей указатель. Пример:
boost::shared_ptr< MyObject > Instance( getObject( ), deleteObject );
Если для DLL не требуется C-интерфейс, то getObject
может возвращать shared_ptr.
Приложение Template Method образцов имеет две основные характеристики:
защищенными
конструкторами и опционально объявленный как абстрактный
), который будет классифицирован в коде клиента. final
, в Java); его документация API должна точно указывать, какие примитивные методы работы она вызывает, и когда (то есть должна описывать «алгоритм»). Примитивный метод работы, представляющий собой шаг в алгоритме, должен быть непубличным, но переопределяемым ( protected
, в Java), и может быть двух типов: а) абстрактный метод, который должен быть реализован в подклассе; b) метод с реализацией по умолчанию/пустой реализацией, которая может быть переопределена в подклассе. Хорошим примером в Java 6 SDK является метод execute ()
класса javax.swing.SwingWorker
(это метод public final void
). В этом случае примитивными методами работы являются doInBackground ()
, process (List)
и done ()
. Первый является абстрактным и поэтому требует реализации в подклассе; вызывается методом шаблона в фоновом потоке. Две другие имеют пустые реализации и могут быть необязательно переопределены в подклассе; они вызываются во время и в конце обработки, соответственно, в EDT (Swing Event Dispatch Thread), чтобы разрешить обновления пользовательского интерфейса.
По своему опыту я иногда использовал этот образец.
Одним из таких случаев был базовый класс Java, реализующий интерфейс java.util.Iterator
, где next ()
был шаблонным методом, и существовал только один примитивный метод операции, ответственный за создание экземпляра определенного класса доменных объектов (это предполагалось использовать при итерации по списку постоянных объектов доменных объектов с помощью JDBC).
Лучшим примером в том же приложении был базовый класс, где метод шаблона реализовывал много-пошаговый алгоритм, предназначенный для заполнения «экрана обслуживания бизнес-объекта» (с использованием Swing) из заданного списка постоянных объектов; методы примитивных операций вызывались для 1) очистки текущего состояния экрана и 2) добавления объекта в табличное представление внутри экрана; при необходимости из метода шаблона вызывались другие примитивные операции, если экран был доступен для редактирования.
В конце концов, я должен сказать, что, хотя это, безусловно, полезный дизайн образца, не так часто возникает ситуация, когда это действительно применимо. Просто иметь базовый класс с методами, которые переопределяются в подклассе (гораздо более распространенная ситуация, по моему опыту), недостаточно, само по себе, чтобы квалифицироваться как применение образца.
-121--3545829-Многие встраиваемые устройства имеют серьезно ограниченный стек, такая функция будет иметь большое преимущество в снижении вероятности переполнения стека, при этом предоставляя вам возможность повторного ввода кода.
Меньшие чипсы не имеют возможности поместить переменные в стек, поэтому все параметры неявно являются ячейками памяти.