gpt4 book ai didi

function - 如何获得指向 u32 功能的指针?

转载 作者:行者123 更新时间:2023-11-29 08:22:30 24 4
gpt4 key购买 nike

我怎样才能得到一个指向函数的指针作为 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);

如何获取(我必须有一个泛型函数)?我经常遇到的错误是:

cannot transmute to or from a type that contains unsubstituted type parameters

最佳答案

你不能。

T可以是任何东西;它可以是一个函数指针,一个 u32 , 一个 i32 , 一个 f64 , 一个 String , 一个 Box<[Arc<Mutex<Vec<&[Box<Goombah>]>>>]> ,甚至 () : 什么都没有。编译器甚至无法知道转换是否可能,更不用说正确了。

这是因为您没有采用“指向函数的指针”的函数。你有一个函数接受“绝对任何东西”。如果您将 Rust 泛型视为 C++/D 模板,您需要了解它们的工作方式不同。 Rust 在定义 时根据您告诉它的有关类型的信息检查它的模板。例如,您唯一可以使用完全通用的 T 做的事情是移动它。您已经实例化了通用函数 T是一个函数类型是无关紧要的:到那个时候,Rust 已经决定泛型代码是否有效。

To use a different analogy: Rust generics are to C++ templates what C++ typing is to Python typing: static and done ahead-of-time instead of ad-hoc and done on-demand.

那么,您如何指定您需要某种指向函数的指针呢?你不能。

无法指定任意类型的函数指针。 Rust 没有可变参数泛型,因此您无法表达参数列表所需的可变数量类型的想法。

Fn*特征,但使用这些特征只会让情况变得更糟。由于您还没有解释为什么您尝试这样做,因此很难知道您应该做什么。

可以做的是请求函数指针的特定形状

fn getter_0_args<R>(f: fn() -> R) { ... }
fn getter_2_args<A0, A1, R>(f: fn(A0, A1) -> R) { ... }

或者您可以在调用 代码中进行转换:

getter_1_arg(f as fn(_) -> _ as usize)

(我在这里使用 _ 来让推理为我填充参数和返回类型。)

这让我想到了我的最后一点:当 as 时,完全不需要为此使用转化。工作很好。此外,使用 u32因为这是错误的:你应该使用usizeisize用于指针和长度大小的东西。

关于function - 如何获得指向 u32 功能的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36320479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com