マクロで実装を定義する場合、構造体メンバ型にアクセスして余分な引数として渡す必要がないようにすると便利です。それはどのタイプの事前に知らなくても、構造体のメンバの種類にアクセスする方法はあり関数シグネチャや宣言のための構造体メンバの型にアクセスすることは可能ですか?
impl PartialEq<u32> for MyStruct { ... }
(this questionを参照してください)?
場合、それは便利です、これは私がこれを行うに興味がある理由の省略例です。
struct_bitflag_impl!(
pub struct MyFlag(u8);,
MyFlag, u8);
// ^^ how to avoid having this extra arg?
// (Used by ``impl PartialEq<$t_internal> for $p``)
// couldn't it be discovered from `MyFlag.0` ?
// the macro
macro_rules! struct_bitflag_impl {
($struct_p_def: item, $p:ident, $t_internal:ty) => {
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
$struct_p_def
impl ::std::ops::BitAnd for $p {
type Output = $p;
fn bitand(self, _rhs: $p) -> $p { $p(self.0 & _rhs.0) }
}
impl ::std::ops::BitOr for $p {
type Output = $p;
fn bitor(self, _rhs: $p) -> $p { $p(self.0 | _rhs.0) }
}
impl ::std::ops::BitXor for $p {
type Output = $p;
fn bitxor(self, _rhs: $p) -> $p { $p(self.0^_rhs.0) }
}
impl ::std::ops::Not for $p {
type Output = $p;
fn not(self) -> $p { $p(!self.0) }
}
// support comparison with the base-type.
impl PartialEq<$t_internal> for $p {
fn eq(&self, other: &t_internal) -> bool {
self.0 == *other
}
}
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// How to avoid using 't_internal' here?
}
}
@keeprからのコメント、これは 'custom_derive'によって処理される可能性があります:https://docs.rs/custom_derive/*/custom_derive/index.html – ideasman42