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