从Option<T>中提取类型T

7

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

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

我希望将未包装的值存储在一个结构体中。然而,对于内部函数指针类型没有类型别名,那么我该如何定义这个结构体呢?我不能重构代码,因为它是自动生成的。
我想要做类似于以下的事情(使用C++伪代码):
struct FunctionTable {
  decltype((None as SomeFnPointerType).unwrap()) unwrappedFn;
  /* ... */
};

或者只需使用SomeFnPointerType::T,如果允许的话。

在Rust中是否可能实现这一点?如果不行,我唯一看到的方法就是手动将生成的文件中的代码复制粘贴到一个单独的手写文件中,并手动保持类型同步。

1个回答

7
您可以定义一个 trait,将 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(|| {});
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接