繁体   English   中英

我可以有一个泛型函数来接受所有未实现特征的类型吗?

[英]Can I have a generic function that accepts all types that do not implement a trait?

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

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]

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM