将标记结构注册到枚举中的宏
A macro registering marked structures into an enum
我正在寻找一个宏或过程宏,它可以将一些标记的结构(或枚举)注册为枚举的变体。
此外,我想,如果标记的结构正在实现一个特征,那么这个特征将由这个枚举来实现。
例如,我想要这样的东西:
trait MyTrait {
fn print_it(&self);
}
#[register(RegEnum,MyTrait)]
struct Foo;
#[register(RegEnum,MyTrait)]
struct Bar;
impl MyTrait for Foo {
fn print_it(&self) { println!("Foo"); }
}
impl MyTrait for Bar {
fn print_it(&self) { println!("Bar"); }
}
fn main() {
let reg_1 = RegEnum::Foo;
let reg_2 = RegEnum::Bar;
// This will print "Foo"
reg_1.print_it();
// This will print "Bar"
reg_2.print_it();
}
请注意,宏应该通过考虑标记的结构来构建枚举。 程序员不会定义枚举。
有办法吗?
首先,您无法知道有多少结构被该属性注释。所以你必须为每次调用传递这个数字。
宏应该缓存结构,当达到该数量时,它将构建并发出特征。如果已经达到这个数字,它也应该出错,所以你会得到 future-proof 反对新结构而不是无声的错误编译。
查看 enum_dispatch
's source 中的宏示例。
请注意,不保证项目的顺序,而且增量编译只能用部分项目调用宏。另外,据我所知,不能保证编译器每次调用都会使用相同的进程,所以理论上它可能会中断,但实际上它运行良好(但不确定它是否仍然适用于增量编译)。
我正在寻找一个宏或过程宏,它可以将一些标记的结构(或枚举)注册为枚举的变体。 此外,我想,如果标记的结构正在实现一个特征,那么这个特征将由这个枚举来实现。 例如,我想要这样的东西:
trait MyTrait {
fn print_it(&self);
}
#[register(RegEnum,MyTrait)]
struct Foo;
#[register(RegEnum,MyTrait)]
struct Bar;
impl MyTrait for Foo {
fn print_it(&self) { println!("Foo"); }
}
impl MyTrait for Bar {
fn print_it(&self) { println!("Bar"); }
}
fn main() {
let reg_1 = RegEnum::Foo;
let reg_2 = RegEnum::Bar;
// This will print "Foo"
reg_1.print_it();
// This will print "Bar"
reg_2.print_it();
}
请注意,宏应该通过考虑标记的结构来构建枚举。 程序员不会定义枚举。
有办法吗?
首先,您无法知道有多少结构被该属性注释。所以你必须为每次调用传递这个数字。
宏应该缓存结构,当达到该数量时,它将构建并发出特征。如果已经达到这个数字,它也应该出错,所以你会得到 future-proof 反对新结构而不是无声的错误编译。
查看 enum_dispatch
's source 中的宏示例。
请注意,不保证项目的顺序,而且增量编译只能用部分项目调用宏。另外,据我所知,不能保证编译器每次调用都会使用相同的进程,所以理论上它可能会中断,但实际上它运行良好(但不确定它是否仍然适用于增量编译)。