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