如何获得指向函数的指针u32
?
我有一个函数,指向函数的指针:
fn getter_of_functions<T>(pointer: T) {
// ...
/*
This code don't compile ...
let fun_ptr: u32 = unsafe {
mem::transmute::<T, u32>(callback)
};
*/
}
fn function() {
println!("hello ...");
}
getter_of_functions(function);
Run Code Online (Sandbox Code Playgroud)
如何获得它(我必须有一个通用的功能)?我经常犯的错误是:
cannot transmute to or from a type that contains unsubstituted type parameters
Run Code Online (Sandbox Code Playgroud)
你不能.
T
可能是任何东西; 它可以是一个函数指针,一个u32
,一个i32
,一个f64
,一个String
,Box<[Arc<Mutex<Vec<&[Box<Goombah>]>>>]>
甚至是()
:什么都没有.编译器无法知道转换是否可以远程转换,更不用说正确了.
这是因为您没有使用"指向函数的指针"的函数.你有一个"绝对任何东西"的功能.如果您正在处理像C++/D模板这样的Rust泛型,那么您需要了解它们的工作方式不同.Rust会根据您告诉它涉及的类型,在定义时检查其模板.例如,你可以用完全通用的东西T
来移动它.你已经实例化了泛型函数,这T
是一个函数类型是无关紧要的:到发生的时候,Rust已经决定了通用代码是否有效.
使用不同的类比:Rust泛型是C++模板,C++输入是Python输入的类型:静态和提前完成而不是ad-hoc和按需完成.
那么,你如何指定你想要某种指向函数的指针呢?你不能.
无法指定任何类型的函数指针.Rust没有可变参数泛型,因此您无法表达可变数量类型的想法,您需要参数列表.
有Fn*
特点,但使用这些特征只会使情况变得更糟.既然你没有解释为什么要这样做,那么很难知道你应该做什么.
你可以做的是要求一个特定形状的函数指针.
fn getter_0_args<R>(f: fn() -> R) { ... }
fn getter_2_args<A0, A1, R>(f: fn(A0, A1) -> R) { ... }
Run Code Online (Sandbox Code Playgroud)
或者您可以在调用代码中执行强制转换:
getter_1_arg(f as fn(_) -> _ as usize)
Run Code Online (Sandbox Code Playgroud)
(我在_
这里使用推理填写参数并为我返回类型.)
这让我想到了最后一点:当工作得很好时,使用transmute是完全没必要的.另外,使用它是错误的:你应该使用或用于指针和长度大小的东西.as
u32
usize
isize