問題タブ [member-pointers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - memberpointer が指すメンバーの型を取得する
メンバー ポインターが指すメンバーの型を抽出したいと思います。
コメントで提案されているように使用decltype
してみましたが、これには問題があります。
buffer
はstd::shared_ptr<std::vector<uint8_t>>
、
someType
ですuint32_t
次のエラー メッセージが表示されます。
エラー: タイプ '__gnu_cxx::__alloc_traits >::value_type {aka unsigned char}' からタイプ 'uint32_t& {aka unsigned int&}' への無効な static_cast </p>
私が理解decltype(instance.*member)
している限り、 member
defined asではなく参照uint32_t instance::*member
が生成されます。インスタンスを値で渡そうとしましたが、エラーが残ります。私は知っていますが、そもそも参照がどのようにそこにあるのかわかりません。 uint32_t&
uint32_t
std::remove_reference
someType
クラスインスタンスなしで を抽出できれば、さらに改善されます。ただし、これを達成する方法はわかりませんが、std lib を次のようにすることで、ポインターなしでクラスを取得できます。
someType
最初にクラスを知らなくても、クラスの一部を取得できる形式でこれを記述する方法がわかりません。次のように書くこともできますが、クラス名と型名を明示的に渡す必要があります。これらを自動的に抽出する方法はありますか? さらに、以下はそもそもコンパイルされません ( http://ideone.com/8VlKO4 ): #include using namespace std;
c++ - 継承されたメンバー関数の一致タイプ
次のコードを抜粋しましたが、コンパイルされません。
&B::foo
に解決されるためコンパイルされないため&A::foo
、提案された型と一致しませんvoid (B::*)()
。これは、非常に特定のインターフェイス (特定の引数の型と出力の型を強制しています) をチェックするために使用している SFINAE テンプレートの一部であるため、チェックを読みやすく保ちながら、継承とは無関係に機能するようにしたいと考えています。
私が試したことは次のとおりです。
引数の 2 番目の部分のキャスト:
helper<void (B::*)(), (void (B::*)())&B::foo> does_not_compile;
残念ながら、2 番目の部分が定数式として認識されず、失敗するため、これは役に立ちません。
それを確認するために、参照を変数に割り当ててみました。
constexpr void (B::* p)() = &B::foo; helper<void (B::* const)(), p> half_compiles;
このコードは clang 3.4 で受け入れられますが、g++ 4.8.1 では拒否され、誰が正しいのかわかりません。
何か案は?
編集:多くのコメントが問題のより具体的なバージョンを求めているため、ここに書きます:
私が探しているのは、クラスが特定のインターフェースを尊重していることを明示的に確認する方法です。このチェックは、テンプレート化された関数の入力引数を検証するために使用され、それらの関数が必要とするコントラクトを尊重し、クラスと関数に互換性がない場合にコンパイルが事前に停止するようにします (つまり、型特性の種類のチェック)。
したがって、要求する各メンバー関数の戻り値の型、引数の型と数、constness などを確認できる必要があります。最初の質問は、一致を検証するために使用しているより大きなテンプレートのチェック部分でした。
c++ - メンバー変数ポインター
特定の構造体の場合:
関数への呼び出しワッパーを作成できstd::mem_fn( &foo::fooFunc )
ます。これにより、別のメソッドに渡してオブジェクトで呼び出すことができます。
同様の呼び出しラッパーがあるかどうかを知りたいのですが、メンバー変数用です。
たとえば、ここではメンバー変数へのポインターを使用していますが、呼び出しラッパーを使用したいと思います。
c++ - C++ の厳密なエイリアシング規則とメンバーへのポインター
次のコードは、G++ で警告を生成します。
とにかく正常に動作しますが、それが心配です。
これらの「サブメンバー」ポインターは、プレーンメンバーポインターよりも厳密なエイリアシングの問題の影響を受けやすいのでしょうか?
c++ - 派生クラスは、保護された基本クラス メンバーへのメンバー ポインターを使用できません
派生型が基本クラスの保護されたメンバーへのポインターを作成できない理由がわかりません。メンバーにアクセスする権限があります。同様のスコープの関数を呼び出すことができます。メンバーポインタを作成できないのはなぜですか? gcc 4.1.2 を使用していますが、次のエラーが発生します。
c++ - Derived T::* を Base T::* にキャストできないのはなぜですか?
背景:多くの関数型言語は代数データ型をサポートしており、仮想関数と継承である程度エミュレートできます。
派生型のサイズが異なるため、最も明白な解決策はヒープの割り当てです。ただし、ユニオンを使用して、追加の割り当てなしでスタック上の最大の型を保持できるはずです。これには、ベースへの追加のポインターを共用体と共に格納する必要があり、同時にコピーと代入が複雑になります。
アクティブなユニオン メンバーを指すユニオンの先頭からのオフセットとしてメンバー セレクターを格納することにより、後者の問題を解決することは非常に重要です。C++には、各メンバーへのポインターが異なる型を持つことを除いて、目的にほぼ適合しているように見えるメンバーポインターがあります。
質問: Derived T::* を Base T::* にキャストできないのはなぜですか?
上記とは関係のない、同じ制限にぶつかるおもちゃの例を次に示します。
生成されたコンパイル エラー:
c++ - ポインタークラスの引数をクラスメンバーにコピーする利点は?
DirectX Graphics クラスを使用してサーフェスを作成し、スプライトを描画するプレーヤー クラスがあります。
次のように、グラフィックス クラスをプレーヤー クラス メソッドへのポインターとして渡します。
プレーヤー クラス内で、Init メソッドがポインターを別のポインター メソッドに渡します。プレーヤー クラスで別のグラフィックス ポインターを作成し、代わりにポインター引数をコピーする利点はありますか?
したがって、この:
対これ:
m_pGraphics ポインターを使用すると、同じクラス (描画メソッドなど) でポインターを再利用できることはわかっていますが、とにかくプレーヤー クラスでメソッドを呼び出すので、ポインターを何度も何度も渡し続けることはできませんか?
c++ - テンプレート パラメーターとしてのクラス メンバーへのポインター (次のクラスの型を使用)
タイプ セーフな container_of メンバー関数を持つテンプレート クラスとして内部リストを定義しようとしています。そのためには、テンプレートにコンテナーのタイプと、コンテナー内でリストを見つけることができるオフセット (メンバー ポインター) を含める必要があります。(C の例については、以下を参照してください)。
次のようになります。
しかし <> では、タイプ List はまだ定義されていないため、使用できません。私の次の試みは:
しかし、「???」には何を入れるのですか?それは、??? を含む <> 全体でなければなりません。したがって、無限の再帰が得られます。
次に、型の安全性について少しごまかそうとしました。
しかし、それは私に与えます:
Cプリプロセッサマクロを使用すると、次のようになります。
では、これはテンプレートで表現できますか?
c++ - クラス メンバーへのポインターを介して関数を呼び出す
次のコードでは:
bar::bar_functionを機能させるための正しい構文は何ですか?