gpt4 book ai didi

generics - 是否可以在泛型函数中排除引用参数?

转载 作者:行者123 更新时间:2023-11-29 07:54:19 25 4
gpt4 key购买 nike

由于通用类型参数 T 可以是任何类型,包括引用,我想知道是否可以在通用函数中选择退出引用,即能够编写类似:

use std::ops::Deref;

fn foo<T: !Deref>(x: T) -> T {}

然而,这是不允许的,并且已经在解析阶段中断了。

我读到了 optin_builtin_traits , 但它只支持选择退出自动特征,所以它也不起作用,因为 Deref 不是自动特征。

这有可能实现吗?

最佳答案

是的,您可以为此使用自动特征:

#![feature(auto_traits)]
#![feature(negative_impls)]

auto trait NotReference {}

impl<'a, T> !NotReference for &'a T {}
impl<'a, T> !NotReference for &'a mut T {}

fn no_references<T: NotReference>(_: T) {}

fn main() {
no_references(42); // OK
no_references(&42); // the trait bound `&{integer}: NotReference` is not satisfied
no_references("hello"); // the trait bound `&str: NotReference` is not satisfied

no_references(vec![1, 2, 3]); // OK

let x = vec![1, 2, 3];
no_references(x.iter()); // the trait bound `&{integer}: NotReference` is not satisfied in `std::slice::Iter<'_, {integer}>`
}

请注意,这也排除了:

  • 引用 'static 生命周期,如“hello”调用所示
  • 包含引用的任何结构,如 iter() 调用所示

I could possibly exclude some lifetime issues.

实际上,这就是 'static 绑定(bind)所做的:

fn foo<T: 'static>(x: T) -> T {}

关于generics - 是否可以在泛型函数中排除引用参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49924247/

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