AngelScript Help

Перегрузка

https://www.angelcode.com/angelscript/sdk/docs/manual/doc_script_func_overload.html

Объявление нескольких функций в одном пространстве имён с одинаковым именем и различным набором аргументов называется перегрузкой функции.

void Log(string Msg){} void Log(int Msg){} void main(){ Log("1"); // Будет вызвана: void Log(string Msg) Log(1); // Будет вызвана: void Log(int Msg) }

Перегрузки размечаются на этапе компиляции и компилятор пытается найти самую подходящую функцию для вызова основываясь на типах параметров. Тип возвращаемого значения не влияет на выбор функции.

Приведение типов

При передаче аргумента в функцию происходит неявное приведение типов:

void A(int64 B){ print(B); } void main(){ A(1); // Передаём числовой литерал, который расценивается как int32 }

При выборе подходящей функции происходит подсчёт стоимости преобразования каждого аргумента. Если по итогу окажется две функции с одинаковой стоимостью, то будет сгенерирована ошибка.

const

Стоимость const учитывается при расчёте, но при идентичных типах приводит к неоднозначности.

void A(int B){} void A(const int B){} void main(){ A(1); //Ошибка! Две функции подходят под условие перегрузки }

Ссылки

Ссылки учитываются при расчёте, но при идентичных типах приводят к неоднозначности.

void A(int B){} void A(int& B){} void main(){ A(1); //Ошибка! Две функции подходят под условие перегрузки }

Числа

Все числа совместимы. В некоторых случаях с потерей байт или изменением значения.

Преобразования происходят в следующем порядке.

Преобразование

Пример

Перечисление в целое число того же размера

enumint32

Перечисление в целое число другого размера

enumint64

Увеличение размерности числа

floatdouble

Уменьшение размерности числа

int64int32

Знаковое целое в беззнаковое

int32uint32

Беззнаковое целое в знаковое

uint32int32

Целочисленное в вещественное

int32float

Вещественное в целочисленное

doubleint64

Преобразования происходят последовательно, ниже приведено несколько примеров.

Цель преобразования

Цепочка преобразования

enumint64

enumint64

int8uint64

int8int16int32int64uint64

doubleuint16

doubleint64int32int16uint16

int32uint64

int32int64uint64

Поиск функции

После нахождения всех подходящих функций для каждой позиции аргумента будет построен список подходящих функций. Возьмём для примера несколько функций:

void A(int8 B, int16 C, int32 D){}; // I void A(int32 B, int16 C, int8 D){}; // II void A(string B, int16 C, int8 D){}; // III
A(int16(1), int16(1), int32(1));

int16

int16

int32

I: int16int8

I

I

1

II: int16int32

II

II: int32int16int8

3

III

III: int32int16int8

Наименьшее количество преобразований имеет I, он и будет вызван.

A(int16(1), uint16(1), int16(1));

int16

uint16

int16

I: int16int8

I: int16uint16

I: int16int32

3

II: int16int32

II: int16uint16

II: int16int8

3

III: int16uint16

III: int16int8

Две функции с одинаковым количеством преобразований приведут к неоднозначности и будет сгенерирована ошибка.

Last modified: 24 September 2024