我是否可以使用接受所有未实现特征的类型的通用函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我是否可以使用接受所有未实现特征的类型的通用函数?相关的知识,希望对你有一定的参考价值。

我知道我可以让函数只接受实现给定特征的类型。例如,我可以

fn f<T>()
where
    T: MyTrait,
{
    // Super useful stuff
}

如果我想实现一个接受任何不实现给定特征的函数,该怎么办?例如,假设我有一些计算:

  • 需要一些已知的,冗长的预处理,或
  • 有一种特定的方法可以通过预处理进行短切。

我想做的是:

fn preprocess<T>(computation: &mut T)
where
    T: !Shortcut,
{
    // Carry out the expensive precomputation.
}

我试图弄清楚如何解决这个问题,但我似乎无法弄清楚任何解决方案。

答案

你不能。

相反,您可以使用不稳定的专业化功能,以选择更有效的处理:

#![feature(specialization)]

trait Process {
    fn process(self);
}

trait Short {}

impl Short for i32 {}

impl<T> Process for T
where
    T: std::fmt::Debug,
{
    default fn process(self) {
        println!("Processing {:?}", self)
    }
}

impl<T> Process for T
where
    T: std::fmt::Debug + Short,
{
    fn process(self) {
        println!("Shortcut {:?}", self)
    }
}

fn main() {
    42i32.process();
    vec![1, 2, 3].process();
}
Shortcut 42
Processing [1, 2, 3]

也可以看看:

以上是关于我是否可以使用接受所有未实现特征的类型的通用函数?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以重载模板函数以与std :: vector的元素一起使用?

Rust宏接受类型与通用参数

模仿qsort() 实现一个通用排序函数:msort()

是否可以在特征定义中使用“impl Trait”作为函数的返回类型?

是否可以有一个带有 1 个未声明类型的输入参数的构造函数?

Rust 无法推断通用特征 impl 的返回类型