Lect13
.pdfПримерфунктора
#include <iostream>
class AddValue
{
public:
AddValue(int value):m_value(value) {} void operator()(int & arg)const {
arg += m_value;
}
private:
int m_value;
}; |
61 |
Примерфунктора
int main(int argc, char* argv[]) { int value = 10;
AddValue f(5);
std::cout << "Значение до вызова: " << value << std::endl;
f(value);
std::cout<< "Значение после вызова: " << value << std::endl;
return 0;
}
Значение до вызова: 15 Значение после вызова: 10
62
Использованиесостояния функтора
Функтор,вотличиеотфункции, обладаетсостоянием
◦Глобальныеистатическиепеременные функцийврасчетнеберем
◦Состояниефунктора,какиобычного объекта,определяетсязначениемполейданных
Вызовфункторавразныхсостояниях можетприводитькразным результатам
63
Примеризменениясостояния функтора
#include <iostream> class AddValue { public:
AddValue(int value, int delta = 0) |
|
:m_value(value) ,m_delta(delta) { |
|
} |
|
// оператор объявлен как неконстантный! |
|
void operator()(int & arg) { |
|
arg += m_value; |
|
m_value += m_delta; |
|
} |
|
private: |
|
int m_value, m_delta; |
|
}; |
64 |
Примериспользованияфунктора
сизменяющимсясостоянием
class RandomGenerator { public:
RandomGenerator(unsigned modulus, unsigned seed = 0,
unsigned multiplier = 733, unsigned summand = 1559)
:m_modulus(modulus) ,m_seed(seed) ,m_multiplier(multiplier) ,m_summand(summand)
{
}
65
Примериспользованияфунктора
сизменяющимсясостоянием
void Reset(unsigned newSeed) { m_seed = newSeed;
}
unsigned operator()() {
m_seed = m_seed * m_multiplier + m_summand; return m_seed % m_modulus;
}
private:
unsigned m_modulus; unsigned m_seed; unsigned m_multiplier; unsigned m_summand;
};
66
Примериспользованияфунктора сизменяющимсясостоянием
#include <iostream>
int main(int argc, char* argv[]) { RandomGenerator rnd(10);
for (int i = 0; i < 10; ++i) { std::cout << rnd() << ", ";
}
return 0;
}
Вывод:
9, 6, 7, 2, 1, 6, 7, 8, 3, 8,
67
Спасибозавнимание!
68