Обратные вызовы в C++ | страница 95
Рассмотрим теперь поиск максимального и минимального значения для заданного диапазона номеров датчиков. Вначале разработаем вспомогательный класс, который будет последовательно принимать на вход показания датчиков и искать среди них максимальное и минимальное значение (Листинг 100).
>class FindMinMaxValue
>{
>public:
> enum MinMaxSign { MIN_VALUE = 0, MAX_VALUE = 1 }; // (1)
> FindMinMaxValue(SensorNumber first, SensorNumber last, MinMaxSign sign) : // (2)
> sign_(sign), first_(first), last_(last), count_(0)
> {
> if (sign == MIN_VALUE)
> {
> result_ = std::numeric_limits
> }
> else
> {
> result_ = std::numeric_limits
> }
> arrayFunMinMax_[MIN_VALUE] = &FindMinMaxValue::CompareMin; // (5)
> arrayFunMinMax_[MAX_VALUE] = &FindMinMaxValue::CompareMax; // (6)
> }
> void operator()(SensorNumber number, SensorPointer sensor) // (7)
> {
> if ( sensor->isOperable() && (number >= first_ && number <= last_) ) // (8)
> {
> (this->*arrayFunMinMax_[sign_])(sensor->getValue()); // (9)
> count_++; // (10)
> }
> }
> SensorValue result() { return result_; } // (11)
> size_t count() { return count_; } // (12)
>private:
> SensorNumber first; // (13)
> SensorNumber last; // (14)
> MinMaxSign sign; // (15)
> SensorValue result; // (16)
> size_t count; // (17)
> using FunMinMax = void (FindMinMaxValue::*)(SensorValue value); // (18)
> void CompareMin(SensorValue value) // (19)
> {
> if (result_ > value)
> {
> result_ = value;
> }
> }
> void CompareMax(SensorValue value) // (20)
> {
> if (result_ < value)
> {
> result_ = value;
> }
> }
> FunMinMax arrayFunMinMax_[2]; // (21)
>};
В строке 2 объявлен конструктор, который принимает на вход следующие параметры: минимальное значение диапазона номеров; максимальное значение диапазона номеров; параметр, указывающий, что необходим поиск минимального либо максимального значения. В конструкторе инициализируются переменные класса: минимальное значение диапазона (объявлено в строке 13); максимальное значение диапазона (объявлено в 14); параметр для поиска (объявлено в 15); итоговый результат (объявлено в 16); количество датчиков, которые участвовали в поиске (объявлено в 17). В зависимости от переданного параметра начальный результат инициализируется соответственно максимальным либо минимальным значением (строки 3 и 4). Кроме того, инициализируется массив указателей на функцию (строки 5 и 6, объявление в 21). Данные функции предназначены для сравнения и запоминания максимального либо минимального значений (объявлены в 19 и 20).