В C++ 11 вы можете разложить общий тип на тип значения, удалив семантику ссылки/rvalue и cv-квалификаторы, например.Распад типа C + 11-типа в ржавчине
decay<int>::type // type is `int`
decay<const int&>::type // type is `int`
decay<int&&>::type // type is `int`
Есть ли известный механизм, чтобы достичь того же в Русте, что полоски опорных модификаторов, сроки службы и mut
спецификатора? например .:
decay<u32>::type <--- type is `u32`
decay<&u32>::type <--- type is `u32`
decay<&mut u32>::type <--- type is `u32`
decay<&static u32>::type <--- type is `u32`
Для фона, я пытаюсь написать макрос, который генерирует struct
, который хранит значения кучи аргументов функции совпавших с помощью макроса. например, макрос может содержать арг foo: i32, bar: &Vec<String>
, и результирующая структура должна быть:
struct GeneratedStruct {
foo: i32,
bar: Vec<String>,
}
Я думаю, что в Rust это будет обрабатываться непосредственно макросом, а не использовать черты (хотя вы можете сами создать свой признак). Помните, что макросы Rust работают в абстрактном дереве синтаксиса, а не в тексте, поэтому вы можете * анализировать * свои аргументы в макросе. –
Deref может превратить & T в T, но если я не ошибаюсь, нет никакого способа узнать, что T не является самим собой. –
@ MatthieuM. Я не думаю, что макрос может помочь, например. 'type I32Ref = & 'static i32; ...; decay! (I32Ref) 'должен создавать' i32', но на лексическом уровне это не известно. – kennytm