Как проверить на равенство типов в Rust? - PullRequest
3 голосов
/ 09 февраля 2020

Мне нужно проверить, равны ли два типа в const fn. Сравнение TypeId не работает:

#![feature(const_if_match)]
#![feature(const_fn)]
#![feature(const_type_id)]

const fn t<T1: 'static, T2: 'static>() -> bool{
    std::any::TypeId::of::<T1>() == std::any::TypeId::of::<T2>()
}

Ошибка:

error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
 --> src/lib.rs:5:8
  |
5 |     std::any::TypeId::of::<T1>()==std::any::TypeId::of::<T2>()
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Специализация шаблонов, как в C ++, не работает в Rust, поскольку в Rust нет специализации шаблонов ». Итак, есть ли способ проверить на равенство типов в Rust?

1 Ответ

5 голосов
/ 09 февраля 2020

Если вы используете Rust nightly (как вам кажется), вы можете использовать нестабильную функцию specialization и некоторые вспомогательные черты для этого:

#![feature(specialization)]

/// Are `T` and `U` are the same type?
pub const fn type_eq<T: ?Sized, U: ?Sized>() -> bool {
    // Helper trait. `VALUE` is false, except for the specialization of the
    // case where `T == U`.
    trait TypeEq<U: ?Sized> {
        const VALUE: bool;
    }

    // Default implementation.
    impl<T: ?Sized, U: ?Sized> TypeEq<U> for T {
        default const VALUE: bool = false;
    }

    // Specialization for `T == U`.
    impl<T: ?Sized> TypeEq<T> for T {
        const VALUE: bool = true;
    }

    <T as TypeEq<U>>::VALUE
}

Пример на детской площадке

...