是否有可能为由都实现了特征的类型组成的任何元组自动实现特征?

时间:2019-04-06 20:38:30

标签: rust tuples traits variadic

假设我有一个

trait Happy {}

我可以为我想要的任何结构实现Happy,例如:

struct Dog;
struct Cat;
struct Alligator;

impl Happy for Dog {}
impl Happy for Cat {}
impl Happy for Alligator {}

现在,我想自动将impl的{​​{1}}特征{tuple由所有都实现了Happy特征的类型组成。从直觉上讲,所有快乐的元组也是快乐的。

有可能这样做吗?例如,我可以简单地将Happy的实现扩展到两种Happy类型的元组:

Happy

因此,它可以完美编译:

impl <T, Q> Happy for (T, Q) where T: Happy, Q: Happy {}

但是我怎么能将其推广到任何长度的元组呢?据我所知,Rust中没有可变参数的泛型。有解决方法吗?

1 个答案:

答案 0 :(得分:4)

  

我们在Rust中没有可变参数的泛型。

正确。

  

有解决方法吗?

您使用宏:

trait Happy {}

macro_rules! tuple_impls {
    ( $head:ident, $( $tail:ident, )* ) => {
        impl<$head, $( $tail ),*> Happy for ($head, $( $tail ),*)
        where
            $head: Happy,
            $( $tail: Happy ),*
        {
            // interesting delegation here, as needed
        }

        tuple_impls!($( $tail, )*);
    };

    () => {};
}

tuple_impls!(A, B, C, D, E, F, G, H, I, J,);

现在可以编译:

fn example<T: Happy>() {}

fn call<A: Happy, B: Happy>() {
    example::<(A, B)>();
} 

这通常不是一个大问题,因为长元组基本上是不可读的,如果确实需要,您可以始终嵌套元组。

另请参阅: