将标记结构注册到枚举中的宏

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 中的宏示例。

请注意,不保证项目的顺序,而且增量编译只能用部分项目调用宏。另外,据我所知,不能保证编译器每次调用都会使用相同的进程,所以理论上它可能会中断,但实际上它运行良好(但不确定它是否仍然适用于增量编译)。