C++11 C+;11类锈蚀

C++11 C+;11类锈蚀,c++11,macros,rust,C++11,Macros,Rust,在C++11中,您可以将泛型类型分解为值类型,删除引用/右值语义和cv限定符,例如 decay<int>::type // type is `int` decay<const int&>::type // type is `int` decay<int&&>::type // type is `int` 作为背景,我试图编写一个宏,它生成一个struct,存储与宏匹配的一组函数参数的值。e、 例如,宏可能包含argsfoo:i32,b

在C++11中,您可以将泛型类型分解为值类型,删除引用/右值语义和cv限定符,例如

decay<int>::type // type is `int`
decay<const int&>::type // type is `int`
decay<int&&>::type // type is `int`
作为背景,我试图编写一个宏,它生成一个
struct
,存储与宏匹配的一组函数参数的值。e、 例如,宏可能包含args
foo:i32,bar:&Vec
,结果结构应该是:

struct GeneratedStruct {
    foo: i32,
    bar: Vec<String>,
}
struct生成的struct{
foo:i32,
酒吧:Vec,
}
根据评论和中的建议,您可以定义一个特征并使用专门化(Rust 1.15.0中的不稳定特性)来实现这一点

#![专题(专门化)]
使用std::any::TypeId;
性状衰退{
类型;
}
T的impl衰变{
默认类型=T;
}

implI认为在Rust中,这将由宏直接处理,而不是使用traits(尽管您可以自己创建traits)。请记住,than-Rust宏是在抽象语法树上操作的,而不是在文本上,因此您可以实际解析宏中的参数。Deref可以将&T转换为T,但如果我没有弄错的话,就无法知道T本身不是某个&.@MatthieuM。我认为宏没有帮助,例如,
typei32ref=&'static i32。。。;衰退(I32Ref)
应该产生
i32
,但在词汇层面上这是不可能的。@kennytm:啊,确实是在存在别名的情况下…@kennytm:我有一个想法创建一个
特征衰减{type;}
。。。虽然它可以为
和'a T
和'a mut T T
实现,但我不能只为
T
实现它,因为这会产生冲突。很好!我不知道专门化可以应用于相关类型(从来没有想过,真的)。很好!这就行了。不过我不想让我的图书馆不稳定。我将继续研究这个问题,看看我是否能想出一种使用稳定特性的方法。
struct GeneratedStruct {
    foo: i32,
    bar: Vec<String>,
}