Обратные вызовы в C++ | страница 34
При использовании преобразования вызовов можно использовать сокращенную запись без дополнительного объявления промежуточных типов, в этом случае код получается более компактным, но более запутанным (см. Листинг 30)
>// (2) External function
>run(CallbackConverter
>// (3) Static method
>run(CallbackConverter
>// (4) Member merthod
>run(CallbackConverter
>// (6) lambda-expression
>run([capturedValue](int eventID) {/*it will be called by initiator*/});
4.3. Вызовы в алгоритмах
4.3.1. Описание проблемы
Алгоритмы – краеугольный камень информатики, они встречаются практически во всех ее разделах. Таким образом, проектирование и разработка алгоритмов – одна из важнейших задач как в теоретической науке, так и в инженерной практике.
В реализации алгоритмов одной из трудностей, встающей перед разработчиком, является адаптация для конкретной структуры данных. Это связано с тем, что алгоритмы задают последовательность операций, но не определяют данные, с которыми работают. Предполагается, что алгоритм работает с любой структурой данных.
Например, предположим, что мы написали код для алгоритма сортировки. Естественно предположить, что он будет сортировать числа. Но вот появилась новая задача: отсортировать строки. По сравнению с исходной реализацией у нас теперь другая структура данных (строки) и новые правила сравнения (строки сравниваются совсем не так, как числа). А ведь в будущем, возможно, появятся более сложные случаи – например, сортировка структур по отдельным полям… Как написать универсальный код, работающий с любыми типами данных?
4.3.2. Параметризация типов
Обозначенная выше проблема в рамках параметрического полиморфизма решается просто: код оформляется в виде шаблона, параметрами шаблона выступают типы данных. При инстанциировании шаблона генерируется код, в который подставляются соответствующие типы.
Поясним сказанное на примере. Предположим, мы реализовали алгоритм сортировки пузырьком (Листинг 31).
>void sort_bubble(int* data, size_t size)
>{
> for (size_t i = 0; i < size – 1; i++)
> {
> for (size_t j = 0; j < size – i – 1; j++)
> {
> if (data[j + 1] < data[j])