Обратные вызовы в C++ | страница 96
Анализ очередного значения происходит в перегруженном операторе 7. На вход подаются номер датчика и указатель на датчик. Если датчик работоспособный и его номер попадает в заданный диапазон номеров (строка 8), то в зависимости от параметра поиска через указатель вызывается соответствующая функция для анализа (строка 9), а также увеличивается счетчик просмотренных датчиков (строка 10). Функции 11 и 12 возвращают итоговые результаты.
Итак, класс для анализа готов. Теперь можно вызвать метод для итерации по элементам контейнера, и в качестве обратного вызова передать экземпляр соответствующего вспомогательного класса. Метод будет вызывать перегруженный оператор, и таким образом, мы узнаем минимальное либо максимальное значение (Листинг 101).
>SensorValue SensorControl::getMinValue(SensorNumber first, SensorNumber last)
>{
> checkInitialize();
> FindMinMaxValue fmv(first, last, FindMinMaxValue::MIN_VALUE);
> sensorContainer_->forEachSensor(fmv);
> return fmv.result();
>}
>SensorValue SensorControl::getMaxValue(SensorNumber first, SensorNumber last)
>{
> checkInitialize();
> FindMinMaxValue fmv(first, last, FindMinMaxValue::MAX_VALUE);
> sensorContainer_->forEachSensor(fmv);
> return fmv.result();
>}
6.3. Разработка системного API
6.3.1. API как оболочка
Уже после того, как классы модуля были разработаны, протестированы и начали использоваться в системе, появилось новое требование – ввести поддержку системного API. Как известно, в интерфейсах системных API можно использовать только внешние функции и простые структуры данных в стиле C; классы и другие специфические конструкции C++ использовать нельзя (см. п. 1.4.2). Так что же, все теперь придется переписывать? Можно предложить следующее решение: использовать интерфейс API как оболочку для вызова методов класса. Концептуальный пример приведен в Листинг 102.
>using ControlPointer = std::unique_ptr
>ControlPointer g_SensorControl(sensor::ISensorControl::createControl());
>void initialize () // This function is declared in the header file as part of API interface
>{
> g_SensorControl->initialize();
>}
Однако не все так просто, перед нами встают следующие проблемы.
1. В исходной реализации мы использовали специфические типы C++, такие, как std::function, smart pointers и т. п., что не допускается в интерфейсах системных API. Какие типы использовать взамен?