如何获得一个指向u32功能的指针?

您所在的位置:网站首页 函数指针是 如何获得一个指向u32功能的指针?

如何获得一个指向u32功能的指针?

#如何获得一个指向u32功能的指针?| 来源: 网络整理| 查看: 265

如何获得指向函数的指针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