Извлечение типа Т из варианта <T> - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть некоторый код, сгенерированный bindgen, который имеет указатели функций, представленные как Option<T>.

pub type SomeFnPointerType = ::std::option::Option<
  unsafe extern "C" fn ( /* .. large number of argument types .. */) 
    -> /* return type */
> ;

Я хочу сохранить развернутые значения в структуре.Однако для типов указателей на внутренние функции нет псевдонимов, так как я могу определить эту структуру?Я не могу реорганизовать код, потому что он генерируется автоматически.

Я хочу сделать что-то вроде этого (в псевдокоде C ++ 'ish):

struct FunctionTable {
  decltype((None as SomeFnPointerType).unwrap()) unwrappedFn;
  /* ... */
};

или, может быть, просто SomeFnPointerType::T, если это такпозволено.

Можно ли добиться этого в Rust?Если нет, то единственный способ увидеть это - вручную определить эти типы путем копирования кода из сгенерированного файла в отдельный рукописный файл и синхронизации типов вручную.

1 Ответ

0 голосов
/ 08 декабря 2018

Вы можете определить черту, которая выставляет T как связанный тип.

trait OptionExt {
    type Type;
}

impl<T> OptionExt for Option<T> {
    type Type = T;
}

type MyOption = Option<fn()>;

fn foo(f: <MyOption as OptionExt>::Type) {
    f();
}

fn main() {
    foo(|| {});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...