列挙型メンバーのポインターオフセットをバイト単位で取得するにはどうすればよいですか?

アイデアマン42

構造体メンバーの場合、offsetofCと同様に、Rustでを計算することができoffsetofます。

これは構造体フィールドでは機能しますが、列挙型とそのバリアントメンバーに対してこれを行う方法に相当するものを見つけることができませんでした。

IRCで開発者と話すことから、列挙型のすべてのメンバーが整列していることは保証されません。

列挙型メンバーのオフセットを計算する方法は?


インスタンスでは、次のように機能します。

enum Test { A(u8), B(f64) };

fn test_me(a: Test) {
    if let Test::A(b) = a {
        // we could find the offset between 'a' and 'b' here.
        // but how to do this without instantiating variables?
        println("{}", (b as *const _) as usize - (a as *const _) as usize);
    }
}

ただし、目的は型のみを検査することでこれを実行できるようにすることです。そのため、定数にコンパイルできます。例:

println("{}", offset_of_enum!(Test, A));

このためのマクロを書き込もうとしたときに、引数の結合で問題が発生した::ため、その部分を解決する方法がわかりませんでした。

oli_obk

列挙型のバリアントは、構造体フィールドとは大きく異なります。列挙型バリアントには、列挙型のタイプとは異なる一意のタイプはありません。Rustコンパイラの内部でさえ、列挙型は列挙型の判別式を含めて表されます。これは、列挙型バリアントの列挙自体へのオフセットがゼロであることを意味します。

列挙型バリアントのフィールドのオフセットが必要になる可能性が高くなります。列挙型バリアントのフィールドへの参照を取得する唯一の方法は列挙型の値と一致することであるため、一致する有効な列挙型値が必要になるため、構造体フィールドオフセットで使用されるnullpointerトリックを使用できません。計算。

macro_rules! offset_of {
    ($($tt:tt)*) => {
        {
            let base = $($tt)*(unsafe { ::std::mem::uninitialized() });
            let offset = match base {
                $($tt)*(ref inner) => (inner as *const _ as usize) - (&base as *const _ as usize),
                _ => unreachable!(),
            };
            ::std::mem::forget(base);
            offset
        }
    }
}
enum Foo {
    A(i32),
    B(u8),
}
let offset = offset_of!(Foo::A);

複数のフィールドを持つ列挙型構造体バリアントおよび列挙型タプルバリアントに対してこのマクロを実装するのは、読者に任されています。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

バイト単位でポインタオフセットを取得するにはどうすればよいですか?

分類Dev

列挙型を使用して、1つ以上の「フォーマットされていない」文字列を単一のフォーマットされた文字列にバインドするにはどうすればよいですか?

分類Dev

kotlinの序数で列挙型メンバーを取得するにはどうすればよいですか?

分類Dev

列挙型をWPFのコンボボックスコントロールにバインドするにはどうすればよいですか?

分類Dev

MVCレイザーコードを介して列挙型メンバーの表示名属性を取得するにはどうすればよいですか?

分類Dev

静的にのみインポートできるメソッドの型変数をバインドするにはどうすればよいですか?

分類Dev

Java:列挙型でコンストラクタのオーバーロードを使用するにはどうすればよいですか?

分類Dev

マウスオーバーでハイチャートグラフポイントの値を取得するにはどうすればよいですか?

分類Dev

java jdbcの結果セットから列のサイズをバイト単位で取得するにはどうすればよいですか?

分類Dev

nodejsを使用してmongodb単一ドキュメントのサイズをバイト単位で取得するにはどうすればよいですか?

分類Dev

メンバーサブセットをPython列挙型に追加するにはどうすればよいですか?

分類Dev

参照メンバーへのポインタを取得するにはどうすればよいですか?

分類Dev

nodejsでバイト単位の文字列長を取得するにはどうすればよいですか?

分類Dev

コンストラクターを列挙型で安全にオーバーロードするにはどうすればよいですか?C#

分類Dev

FullCalendarのイベントからポップオーバーメッセージでイベントの開始時刻と終了時刻を取得するにはどうすればよいですか?

分類Dev

ドワーフ情報から構造体メンバーのオフセットを取得するにはどうすればよいですか?

分類Dev

PostGISでバッファサイズを度からメートル単位の距離に変更するにはどうすればよいですか?

分類Dev

すべての列挙型クラスのtoString()メソッドをオーバーライドするにはどうすればよいですか?

分類Dev

JavaScriptエラーのプロトタイプメンバーオブジェクトキーを取得するにはどうすればよいですか?

分類Dev

マクロ内のタプルのような列挙型バリアントのマッチング。列挙型とバリアントはメタ変数です。マッチングパターンを作成するにはどうすればよいですか?

分類Dev

列挙型バリアントの名前のないフィールドにアクセスするにはどうすればよいですか?

分類Dev

バスの各ビットのカバーポイントをより簡単に作成するにはどうすればよいですか?

分類Dev

列挙型と整数でビット単位のORを使用するにはどうすればよいですか?

分類Dev

Pythonインポートをオーバーライドするにはどうすればよいですか?

分類Dev

CustomPainterのペイント関数でキャンバスのオフセットを取得するにはどうすればよいですか?

分類Dev

特定のネットワークインターフェイスのデバイスIDを取得するにはどうすればよいですか?

分類Dev

関数パラメーターとして一致する列挙型バリアントを渡すにはどうすればよいですか?

分類Dev

多数のオンラインメンバーを取得するにはどうすればよいですか?

分類Dev

イオンフレームワークでポップアップをインターセプトするにはどうすればよいですか?

Related 関連記事

  1. 1

    バイト単位でポインタオフセットを取得するにはどうすればよいですか?

  2. 2

    列挙型を使用して、1つ以上の「フォーマットされていない」文字列を単一のフォーマットされた文字列にバインドするにはどうすればよいですか?

  3. 3

    kotlinの序数で列挙型メンバーを取得するにはどうすればよいですか?

  4. 4

    列挙型をWPFのコンボボックスコントロールにバインドするにはどうすればよいですか?

  5. 5

    MVCレイザーコードを介して列挙型メンバーの表示名属性を取得するにはどうすればよいですか?

  6. 6

    静的にのみインポートできるメソッドの型変数をバインドするにはどうすればよいですか?

  7. 7

    Java:列挙型でコンストラクタのオーバーロードを使用するにはどうすればよいですか?

  8. 8

    マウスオーバーでハイチャートグラフポイントの値を取得するにはどうすればよいですか?

  9. 9

    java jdbcの結果セットから列のサイズをバイト単位で取得するにはどうすればよいですか?

  10. 10

    nodejsを使用してmongodb単一ドキュメントのサイズをバイト単位で取得するにはどうすればよいですか?

  11. 11

    メンバーサブセットをPython列挙型に追加するにはどうすればよいですか?

  12. 12

    参照メンバーへのポインタを取得するにはどうすればよいですか?

  13. 13

    nodejsでバイト単位の文字列長を取得するにはどうすればよいですか?

  14. 14

    コンストラクターを列挙型で安全にオーバーロードするにはどうすればよいですか?C#

  15. 15

    FullCalendarのイベントからポップオーバーメッセージでイベントの開始時刻と終了時刻を取得するにはどうすればよいですか?

  16. 16

    ドワーフ情報から構造体メンバーのオフセットを取得するにはどうすればよいですか?

  17. 17

    PostGISでバッファサイズを度からメートル単位の距離に変更するにはどうすればよいですか?

  18. 18

    すべての列挙型クラスのtoString()メソッドをオーバーライドするにはどうすればよいですか?

  19. 19

    JavaScriptエラーのプロトタイプメンバーオブジェクトキーを取得するにはどうすればよいですか?

  20. 20

    マクロ内のタプルのような列挙型バリアントのマッチング。列挙型とバリアントはメタ変数です。マッチングパターンを作成するにはどうすればよいですか?

  21. 21

    列挙型バリアントの名前のないフィールドにアクセスするにはどうすればよいですか?

  22. 22

    バスの各ビットのカバーポイントをより簡単に作成するにはどうすればよいですか?

  23. 23

    列挙型と整数でビット単位のORを使用するにはどうすればよいですか?

  24. 24

    Pythonインポートをオーバーライドするにはどうすればよいですか?

  25. 25

    CustomPainterのペイント関数でキャンバスのオフセットを取得するにはどうすればよいですか?

  26. 26

    特定のネットワークインターフェイスのデバイスIDを取得するにはどうすればよいですか?

  27. 27

    関数パラメーターとして一致する列挙型バリアントを渡すにはどうすればよいですか?

  28. 28

    多数のオンラインメンバーを取得するにはどうすればよいですか?

  29. 29

    イオンフレームワークでポップアップをインターセプトするにはどうすればよいですか?

ホットタグ

アーカイブ