从Option <T>中提取类型T.

RKS*_*RKS 7 rust

我有一些由bindgen生成的代码,其中包含由函数指针表示的函数Option<T>.

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

我想将未包装的值存储在结构中.但是,内部函数指针类型没有类型别名,那么如何定义该结构呢?我无法重构代码,因为它是自动生成的.

我想做这样的事情(用C++'ish伪代码):

struct FunctionTable {
  decltype((None as SomeFnPointerType).unwrap()) unwrappedFn;
  /* ... */
};
Run Code Online (Sandbox Code Playgroud)

或者也许只是SomeFnPointerType::T在允许的情况下.

在Rust中可以实现吗?如果没有,我看到的唯一方法是通过将生成的文件中的代码复制粘贴到单独的手写文件中手动定义这些类型,并手动保持类型同步.

Fra*_*gné 7

您可以定义一个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(|| {});
}
Run Code Online (Sandbox Code Playgroud)