Сравнение типов¶
В Ü существует оператор same_type
, который сравнивает переданные типы на равенство.
Этот оператор принимает два аргумента-типа и возвращает constexpr
значение типа bool
.
Значение равно true
, если типы равны или false
, если они различны.
Пример использования:
static_assert( same_type</ u32, size_type /> || same_type</ u64, size_type /> );
Данный оператор предназначен прежде всего для использования в шаблонном коде для случаев, когда надо проверить равенство типов. Например, таким образом:
template</ type T /> fn Process( T& arg )
{
if( same_type</ T, ust::string8 /> )
{
ProcessString(arg);
}
else
{
ProcessGeneric(arg);
}
}
Результат сравнения аналогичен сравнению, которое происходит внутри компилятора. Сравнение считает различными типы различных видов. Например, одинаковые по составу массивы/кортежи/структуры считаются различными. Различными являются все структуры/классы, т. к. их идентичность определяется их именем (включая путь от корневого пространства имён). Это включает в себя также наследование - предок и потомок различны. Аналогично различны все перечисления.
Фундаментальные типы тоже все между собою различны.
Исключение - size_type
, который пока что является псевдонимом к одному из целочисленных беззнаковых типов.
Указатели на функцию различны, если различны типы функций.
При этом есть ряд нюансов.
Неявный возвращаемый void
тип аналогичен явно-указанному.
imut
/mut
модификаторы для параметров-значений не влияют на тип функции.
Также существуют имена соглашений о вызовах, которые различаются, но представляют внутри одно и то же соглашение о вызовах, например «Ü» и «C».
Аргумент this
аналогичен не-this
ссылочному аргументу типа класса.
Важно отметить также, что псевдонимы не создают различных типов. Например:
type Int= i32;
static_assert( same_type</ Int, i32 /> ); // сравнение вернёт true