#macro #static #proc-macro

nightly macro count-tys

接受以逗号分隔的 :ty TokenTree 序列,并返回它们的计数的类似函数的过程宏,以 const usize 形式返回

3个版本

0.1.2 2020年4月25日
0.1.1 2020年4月25日
0.1.0 2020年4月25日

#1989 in 过程宏

MIT 许可证

9KB

count_tys!() 类函数宏

返回给定 :ty(类型)在逗号分隔的 TokenStream 中的计数,作为类型为 usize 的常量表达式

参数

  • input - 一个包含逗号分隔的 :ty(类型)必须计数的 TokenStream

示例

基本用法

// count_tys!($($ty:ty),*)

更完整的示例

Cargo.toml

/*
[dependencies]
proc-macro-hack = "0.5"
count-tys = "0.1"
*/

main.rs

extern crate proc_macro_hack;
use proc_macro_hack::proc_macro_hack;
#[proc_macro_hack]
use count_tts::count_tys;

// It not necessarily must be a struct, it could be a generic
// Read more about macro_rules! here:
// <https://doc.rust-lang.net.cn/rust-by-example/macros.html>
macro_rules! declare_variadic_struct {
   ($struct_name:ident, <$($ty:ty),*>) => {
        struct $struct_name {
            // fields
        }

        impl $struct_name {
            pub const fn count() -> usize {
                // count_tys!() can be used in an expression and even
                // const expression context
                // unlike macros without proc_macro_hack
                // note: see issue #54727
                // <https://github.com/rust-lang/rust/issues/54727>
                // for more information.
                count_tys!($($ty:ty),*)
            }
        }
    };
}

// declare_variadic_struct!(VariadicStruct, <usize, usize, usize>);
// expands into the following:
//
// struct VariadicStruct {
//      // fields
// }
//
// impl VariadicStuct {
//      pub const fn count() -> usize {
//          3usize
//      }
// }
declare_variadic_struct!(VariadicStruct, <usize, usize, usize>);
assert_eq!(VariadicStruct::count(), 3);

依赖项

~1.5MB
~35K SLoC