3 votes

Limites conditionnelles sur les implants de traits basés sur le drapeau des caractéristiques ?

Supposons que j'ai un code comme :

impl<A> Stream for MyStruct<A> 
where
    A: MyTrait
{
    // ...
}

Mais si un certain indicateur de fonctionnalité est activé, alors A doit également être Send + Sync donc j'ai besoin A: MyTrait + Send + Sync si cette fonction est activée. Existe-t-il un moyen de le faire sans avoir à dupliquer l'implémentation ? Il semble que je ne puisse pas utiliser #[cfg(feature = "...")] dans une clause where.

2voto

Caesar Points 108

Comme le souligne @Emoun, ce n'est pas une très bonne idée, mais c'est possible :

#[cfg(feature = "asdf")]
trait MyTraitConditional: MyTrait {}
#[cfg(feature = "asdf")]
impl<T: MyTrait> MyTraitConditional for T {}
#[cfg(all(not(feature = "asdf"), feature = "bsdf"))]
trait MyTraitConditional: MyTrait + Send {}
#[cfg(all(not(feature = "asdf"), feature = "bsdf"))]
impl<T: MyTrait + Send> MyTraitConditional for T {}

Terrain de jeux (avec cfg_if pour une plus faible verbosité)

Alternativement, vous pouvez pousser l'ensemble du impl en un macro_rules qui ne prend que le trait lié comme paramètre, puis invoque la macro différemment selon les traits. (J'ai déjà rencontré des dans la nature mais je ne suis pas un fan).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X