Задание Введение в перегрузку шаблонов и функций. Написать и исследовать несколько функций (около 10) от 1-2 переменных с одинаковым именем. В теле функций просто поставить заглушки типа: cout<< “была вызвана функция func от аргументов типа …”. Объяснить правила разрешения перегрузки компилятором, привести пример неоднозначных вызовов. Добавить 2-3 шаблона функций. Полезная информация. При разрешении перегрузки выполняются следующие шаги: 1. Выделяется множество перегруженных функций для данного вызова, а также распознаются свойства списка аргументов, переданных функции. 2. Выбираются те из перегруженных функций, которые могут быть вызваны с данными аргументами, с учетом их количества и типа. 3. Находится функция, которая лучше всего соответствует вызову. Разберем последовательно каждый пункт. На первом шаге необходимо идентифицировать множество перегруженных функций, которые будут рассматриваться при данном вызове. Вошедшие в это множество функции называются кандидатами. Функция-кандидат – это функция с тем же именем, что и вызванная, причем ее объявление видно в точке вызова. После этого идентифицируются свойства списка переданных ей аргументов, то есть их число и типы. На втором шаге среди множества кандидатов выбираются подходящие – такие, которые могут быть вызваны с данными аргументами. Подходящая функция имеет либо столько же формальных параметров, сколько фактических аргументов передано вызванной функции, либо больше, но тогда для каждого дополнительного параметра должно быть задано значение по умолчанию. Чтобы функция была подходящей, для любого фактического аргумента, переданного при вызове, обязано существовать преобразование к типу формального параметра, указанного в объявлении. Если после второго шага не нашлось подходящих функций, то вызов считается ошибочным. В таких случаях говорят, что отсутствует соответствие. Третий шаг заключается в выборе функции, лучше всего отвечающей контексту вызова. Такая функция называется наиболее подходящей. На этом шаге производится ранжирование преобразований, использованных для приведения типов фактических аргументов к типам формальных параметров подходящей функции. Наиболее подходящей считается функция, для которой выполняются следующие условия: преобразования, примененные к фактическим аргументам, не хуже преобразований, необходимых для вызова любой другой подходящей функции; для некоторых аргументов примененные преобразования лучше, чем преобразования, необходимые для приведения тех же аргументов в вызове других подходящих функций. Преобразование типов аргументов. На втором шаге разрешения перегрузки функций компилятор идентифицирует и ранжирует преобразования, которые следует применить к каждому фактическому аргументу вызванной функции, чтобы привести его к типу соответствующего формального параметра любой из подходящих функций. Ранжирование может дать один из трех возможных результатов: 1. Точное соответствие. 2. Соответствие с преобразованием типа. 3. Отсутствие соответствия. Категория с преобразованием типов является наиболее сложной. Необходимо рассмотреть несколько видов такого приведения: повышение типов, стандартные преобразования и определенные пользователем преобразования. Преобразования типов ранжируются следующим образом: точное соответствие лучше повышения типа, повышение типа лучше стандартного преобразования, а оно, в свою очередь, лучше определенного пользователем преобразования.