我有一个实现特征的宏impl_Trait!()
.现在,它适用于没有通用参数的类型,但我不确定如何将类型参数添加到impl
关键字.
macro_rules! impl_FooTrait { ($name:ty) => { impl $crate::FooTrait for $name { ... } }; } struct Bar(i32); impl_FooTrait!(Bar); // All OK struct Baz<'a>(&'a i32); impl_FooTrait!(Baz<'a>); // use of undeclared lifetime name `'a`
Simon Whiteh.. 6
以免责声明的方式提交此答案:可能有更好的方法可以做到这一点.我还不熟悉宏观的土地.
你可以使用tt
(单个标记)标识符来接受你想要的另一个宏臂(游乐场链接)的生命周期
macro_rules! impl_FooTrait { ($name:ty, $lifetime:tt) => { impl<$lifetime> $crate::FooTrait for $name { } }; ($name:ty) => { impl $crate::FooTrait for $name { } }; } struct Bar(i32); impl_FooTrait!(Bar); struct Baz<'a>(&'a i32); impl_FooTrait!(Baz<'a>, 'a); // Use and declare the lifetime during macro invocation
看起来我觉得有点奇怪.我有兴趣看到任何其他有替代品的答案.
这是一个实际实现的例子:Playground链接
以免责声明的方式提交此答案:可能有更好的方法可以做到这一点.我还不熟悉宏观的土地.
你可以使用tt
(单个标记)标识符来接受你想要的另一个宏臂(游乐场链接)的生命周期
macro_rules! impl_FooTrait { ($name:ty, $lifetime:tt) => { impl<$lifetime> $crate::FooTrait for $name { } }; ($name:ty) => { impl $crate::FooTrait for $name { } }; } struct Bar(i32); impl_FooTrait!(Bar); struct Baz<'a>(&'a i32); impl_FooTrait!(Baz<'a>, 'a); // Use and declare the lifetime during macro invocation
看起来我觉得有点奇怪.我有兴趣看到任何其他有替代品的答案.
这是一个实际实现的例子:Playground链接