不透明なC構造体からフィールドを公開する

ネルフィール

次の大まかな例のように、特定のセッターとゲッターを介してアクセスする必要がある不透明なフィールドを持つ一部の構造を持つ既存のCライブラリ(変更できません)を使用しています(xCで記述されている場合でも、想像はプライベートです) 。

struct CObject {
    int x;
};

void setCObjectX(CObject* o, int x) {
    o->x = x;
}

int getCObjectX(CObject* o) {
    return o->x;
}

私は、より複雑ではありますが、ラッパーのようなこれらのタイプの構造を個人的に所有するクラスを作成しています。関連するフィールドを便利な方法で公開したいと思います。最初は、必要に応じてセッターとゲッターを書いていました。しかし、私は別のことを考えたので、この方法に欠点があるかどうかを知りたいと思いました。関数ポインタ(std::function)を使用してCセッターとゲッターのペアを格納し、関数ではなくフィールドに直接アクセスするかのように表示します。

このような「偽の」フィールドを定義するために私が書いた汎用クラスは次のとおりです。

template<typename T>
struct IndirectField {
    void operator=(const T& value) {
        setter(value);
    }
    auto operator()() const -> T {
        return *this;
    }
    operator T() const {
        return getter();
    }

    std::function<void(const T&)> setter;
    std::function<T()> getter;
};

これは、C ++クラスのインスタンスを定義し、設定することにより使用されsetter且つgetter対応するCの機能を有します。

IndirectField<int> x;
// ...
x.setter = [=](int x) {
    setCObjectX(innerObject.get(), x);
};
x.getter = [=]() {
    return getCObjectX(innerObject.get());
};

これは、テスト用の完全で機能するコードです。

この方法を使用することに不利な点はありますか?それは最終的に危険な行動か何かにつながる可能性がありますか?

セルゲイ・カリニチェンコ

私はあなたのソリューションを参照して最大の問題は、ということであるstd::functionオブジェクトは、各インスタンス内のスペースを取るIndirectField内部CPPObject場合でも、CObjectタイプが同じです。

関数ポインタをテンプレートパラメータにすることで、この問題を修正できます。

template<typename T,typename R,void setter(R*,T),T getter(R*)>
struct IndirectField {
    IndirectField(R *obj) : obj(obj) {
    }
    void operator=(const T& value) {
        setter(obj, value);
    }
    auto operator()() const -> T {
        return *this;
    }
    operator T() const {
        return getter(obj);
    }
private:
    R *obj;
};

この実装の使用方法は次のとおりです。

class CPPObject {
    std::unique_ptr<CObject,decltype(&freeCObject)> obj;
public:
    CPPObject()
    :   obj(createCObject(), freeCObject)
    ,   x(obj.get())
    ,   y(obj.get()) {
    }
    IndirectField<int,CObject,setCObjectX,getCObjectX> x;
    IndirectField<double,CObject,setCObjectY,getCObjectY> y;
};

このアプローチでは、2つのstd::functionオブジェクトを1つのCObject*ポインタと交換しますIndirectField残念ながら、このポインタはテンプレート内のコンテキストから取得できないため、格納する必要があります。

変更したデモ。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Cファイルで不透明な構造体を再宣言する

分類Dev

不透明な構造体定義を別のヘッダーファイルに入れる

分類Dev

不透明な構造体とのインターフェースにcamlidlを使用する

分類Dev

複雑な構造体/不透明ポインター/関数をC ++ヘッダーからDelphiに変換します

分類Dev

構造体フィールドを持つ構造体をc ++からc#pinvokeに返します

分類Dev

Rust FFIを使用するときに不透明なC構造体を初期化するにはどうすればよいですか?

分類Dev

refect.Valueから構造体フィールドを取得する方法

分類Dev

構造体の反復から空のフィールドを除外する

分類Dev

Golang構造体配列からフィールドを選択する

分類Dev

Cの構造体フィールドを列挙する

分類Dev

Cで構造体フィールドをconstにする

分類Dev

構造体フィールドから完全な階乗サンプリングを作成する賢い方法

分類Dev

クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

分類Dev

クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

分類Dev

いくつかのプライベート操作がある不透明な構造体

分類Dev

別のファイルで構造体を公開する

分類Dev

埋め込まれた構造体から構造体フィールドにアクセスする

分類Dev

構造体配列からフィールドを抽出して、別の構造体配列に配置します

分類Dev

マクロを構造体フィールドに展開することは可能ですか?

分類Dev

構造体をフィールドの少ない別の構造体に変換する方法

分類Dev

Matlabの構造体から別の構造体にフィールド値をエクスポートするにはどうすればよいですか?

分類Dev

構造体からフィールドにアクセスする

分類Dev

構造体のフィールド名を変数から割り当てる方法

分類Dev

アルファ+背景から不透明な色を計算しますか?

分類Dev

golangは構造体から最初のフィールドを返します

分類Dev

構造体の複数のフィールドから行を抽出します

分類Dev

構造体フィールドの値が忘れられるのはなぜですか

分類Dev

構造体ビットフィールドから16進数で完全なuint32_tを出力します

分類Dev

別のパッケージから構造体フィールドを参照する

Related 関連記事

  1. 1

    Cファイルで不透明な構造体を再宣言する

  2. 2

    不透明な構造体定義を別のヘッダーファイルに入れる

  3. 3

    不透明な構造体とのインターフェースにcamlidlを使用する

  4. 4

    複雑な構造体/不透明ポインター/関数をC ++ヘッダーからDelphiに変換します

  5. 5

    構造体フィールドを持つ構造体をc ++からc#pinvokeに返します

  6. 6

    Rust FFIを使用するときに不透明なC構造体を初期化するにはどうすればよいですか?

  7. 7

    refect.Valueから構造体フィールドを取得する方法

  8. 8

    構造体の反復から空のフィールドを除外する

  9. 9

    Golang構造体配列からフィールドを選択する

  10. 10

    Cの構造体フィールドを列挙する

  11. 11

    Cで構造体フィールドをconstにする

  12. 12

    構造体フィールドから完全な階乗サンプリングを作成する賢い方法

  13. 13

    クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

  14. 14

    クロージャで別の構造体フィールドを借用しながら、1つの構造体フィールドを可変的に借用する

  15. 15

    いくつかのプライベート操作がある不透明な構造体

  16. 16

    別のファイルで構造体を公開する

  17. 17

    埋め込まれた構造体から構造体フィールドにアクセスする

  18. 18

    構造体配列からフィールドを抽出して、別の構造体配列に配置します

  19. 19

    マクロを構造体フィールドに展開することは可能ですか?

  20. 20

    構造体をフィールドの少ない別の構造体に変換する方法

  21. 21

    Matlabの構造体から別の構造体にフィールド値をエクスポートするにはどうすればよいですか?

  22. 22

    構造体からフィールドにアクセスする

  23. 23

    構造体のフィールド名を変数から割り当てる方法

  24. 24

    アルファ+背景から不透明な色を計算しますか?

  25. 25

    golangは構造体から最初のフィールドを返します

  26. 26

    構造体の複数のフィールドから行を抽出します

  27. 27

    構造体フィールドの値が忘れられるのはなぜですか

  28. 28

    構造体ビットフィールドから16進数で完全なuint32_tを出力します

  29. 29

    別のパッケージから構造体フィールドを参照する

ホットタグ

アーカイブ