Templates 如何从宏创建参数化类型?

Templates 如何从宏创建参数化类型?,templates,generics,rust,Templates,Generics,Rust,我有一个宏,它创建一个结构和一堆支持函数和trait实现。这个问题的有趣之处在于: macro_rules! make_struct { ($name: ident) => { struct $name; } } 这正如您所期望的: make_struct!(MyStruct); 但是,如果我想制作一个参数化类型,我运气不好: make_struct!(AnotherStruct<T: SomeTrait>); test.rs:8:27:

我有一个宏,它创建一个结构和一堆支持函数和trait实现。这个问题的有趣之处在于:

macro_rules! make_struct {
    ($name: ident) => {
        struct $name;
    }
}
这正如您所期望的:

make_struct!(MyStruct);
但是,如果我想制作一个参数化类型,我运气不好:

make_struct!(AnotherStruct<T: SomeTrait>);

test.rs:8:27: 8:28 error: no rules expected the token `<`
test.rs:8 make_struct!(AnotherStruct<T: SomeTrait>);

那么我如何编写这个宏来处理这两个问题呢?还是我需要把它们分开?在后一种情况下,宏是什么样子的?

在关键字
struct
之后,解析器需要一个ident标记树,后面可能是
{
结构$name;
};
($name:ident)=>{
结构$name;
}
}
正如您所观察到的,让它支持解析器在该位置接受的一切几乎是不可能的;宏规则并没有那么聪明。然而,有一个奇怪的技巧(静态代码分析器讨厌它!),它允许您获取一系列标记树,并将其视为正常的
结构
定义。它只是在宏规则中使用了更多的间接操作:

macro\u规则!项目{
($item:item)=>($item);
}
宏规则!制造结构{
($name:ident)=>{
结构$name;
};
($name:ident){
项目!(结构$name)
test.rs:3:16: 3:21 error: expected ident, found `MyStruct`
test.rs:3         struct $name;