#[cfg(feature = "serde")]
// 下面的3行都会被上面这一行控制,而不是按照我希望的,两个cfg分别控制一行
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[cfg(not(feature = "serde"))]
#[derive(Debug, Default, Clone)]
pub struct VecHash<K, V> {
inner: HashMap<K, Vec<V>>,
}
// 这里希望通过clone_able特性来控制 V 是否需要实现 Clone,但是这个写法不正确
cfg_if::cfg_if!{
if #[cfg(feature = "clone_able")] {
impl<K, V> VecHash<K, V>
where
K: Hash+Eq,
V: PartialEq + Clone
} else {
impl<K, V> VecHash<K, V>
where
K: Hash+Eq,
V: PartialEq,
}
}
{
}
比如以上代码,希望通过feature=serde
来控制结构体是否可以被序列化,通过feature=clone_able
来控制Hash的Value是否是可以Clone的
1
共 5 条评论, 1 页
评论区
写评论啊,我突然想通了,的确是可以拆开写的,在clone_able的impl里面单独写出需要Clone特性的代码就行了
--
👇
LazyBoy: 因为宏的输出本身也是一个{}块,所以你写的impl实现体{}不能写在宏外面。
cfg_if宏其实也只是帮我们拼了一下#[cfg]属性宏的条件,最简单的就是拆开来写,逻辑上最清晰(cfg_if展开也是类似的结果),因为这里的条件足够简单,就可以不需要cfg_if,条件复杂的话用cfg_id也是要把一个完整的impl全写到宏内部才行:
--
👇
asuper: 有没有大佬指点一下,下面cfg_if这里怎么写才能通过
因为宏的输出本身也是一个{}块,所以你写的impl实现体{}不能写在宏外面。
cfg_if宏其实也只是帮我们拼了一下#[cfg]属性宏的条件,最简单的就是拆开来写,逻辑上最清晰(cfg_if展开也是类似的结果),因为这里的条件足够简单,就可以不需要cfg_if,条件复杂的话用cfg_id也是要把一个完整的impl全写到宏内部才行:
--
👇
asuper: 有没有大佬指点一下,下面cfg_if这里怎么写才能通过
有没有大佬指点一下,下面cfg_if这里怎么写才能通过
这个的确可以用,谢谢
这个问题呢
--
👇
lxl66566: #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]