問題タブ [stdbind]

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.

0 投票する
2 に答える
3301 参照

c++ - std::bind() - 派生クラスのメンバー関数から基本保護メンバー関数を呼び出す

bind()派生クラスから関数の基本クラスのバージョンを取得したいと考えています。関数は、ベースで保護されているとマークされています。私がそうすると、コードは Clang (Apple LLVM Compiler 4.1) で問題なくコンパイルされますが、g++ 4.7.2 と Visual Studio 2010 の両方でエラーが発生します。エラーは次の行に沿っています: "'Base::foo' : cannot保護されたメンバーにアクセスしてください。」

つまり、参照のコンテキストは実際には 内bind()にあり、もちろん関数は保護されていると見なされます。しかしbind()、呼び出し元の関数のコンテキスト (この場合は) を継承してDerived::foo()、基本メソッドがアクセス可能であると見なすべきではありませんか?

次のプログラムは、この問題を示しています。

行動の不一致はなぜですか?どちらが正しい?エラーが発生するコンパイラにはどのような回避策がありますか?

0 投票する
1 に答える
271 参照

c++ - std::function 右辺値引数を取るメンバ関数へのポインタ MSVC2010 SP1

右辺値引数を取るメンバー関数にバインドされた std::function を作成したいと思います。これがコンパイルされない私の試みです(「xxfunction(154):エラーC2664:...特に、左辺値を右辺値参照にバインドできません」)。

私はいくつかの読書をしましたが、完全な転送を使用しない std::function に関係していると思いますが、それを機能させる方法がわかりません。

編集:

これはある程度実行可能な回避策ですが、pF の呼び出しは左辺値で機能し、とにかくそれを移動するため、完全ではありません。

0 投票する
1 に答える
3400 参照

c++ - パラメーターをバインドせずに、std::メンバー関数をオブジェクトインスタンスにバインドする簡単な方法

いくつかの引数を持つメンバー関数があります。それを特定のオブジェクト インスタンスにバインドし、これを別の関数に渡したいと思います。私はプレースホルダーでそれを行うことができます:

しかし、これは少し不器用です。たとえば、パラメーターの数が変更されると、すべてのバインド呼び出しも変更する必要があります。しかし、さらに、オブジェクト参照を含む「関数ポインタ」を簡単に作成したいだけなのに、すべてのプレースホルダを入力するのは非常に面倒です。

だから私ができるようにしたいのは次のようなものです:

誰かがこれを行うための良い方法を知っていますか?

0 投票する
2 に答える
6739 参照

c++ - 指定されていない呼び出しラッパーを渡すメンバー関数テンプレートをバインドする方法

VC11 と g++ 4.7.2 を使用して、次の例をコンパイルしようとしました。

しかし、それはエラーで終了しました。コンパイラの出力全体を貼り付けることが合理的かどうかはわかりませんが、一般的には

vc11 言います:

エラー C2664: 'void std::_Pmf_wrap::operator ()(_Farg0 &,_V0_t) const': パラメーター 3 を 'void' から 'std::_Bind,Y *,std::_Nil,std::_Nil に変換できません,std::_Nil,std::_Nil,std::_Nil,std::_Nil>' c:\program files (x86)\microsoft visual studio 11.0\vc\include\functional 1152 1 ConsoleApplication1 (Microsoft Visual C++ コンパイラ Nov 2012 CTP)

および g++:

コンパイルはエラーで終了しました:
source.cpp: 'X::X(T) [with T = std::_Bind(Y*)>]' のインスタンス化中:
source.cpp:28:33: ここから必要
source.cpp :8:9: エラー: '(std::_Bind_helper(Y*)>)、X* const、std::_Bind(Y*)>&>::type {別名 std::_Bind( Y*)>)>(X*, std::_Bind(Y*)>)>}) ()'

この問題を解決する方法はありますか。私にとって非常に重要なことは、主要なアイデアを保存することです。つまり、任意の呼び出し可能なオブジェクト (関数オブジェクト、関数ポインター、または関数によって返される呼び出しラッパーstd::bind()) でインスタンス化できるクラスです。

誰かが助けてくれたら幸いです。

PS のインスタンスを作成し、X関数オブジェクトまたは関数ポインタを渡すとコンパイルされます。

0 投票する
2 に答える
233 参照

c++ - 奇妙なテンプレート構文

gcc-4.7.2のソース コードを調べていて、std::function理解std::bindできないメンバー関数ポインターに使用される構文に出くわしました。

私が理解していないのは、次の専門化です_Maybe_wrap_member_pointer

  • _Tpと の間にコンマがないのはなぜ_Class::*ですか?

  • メンバー関数void foo::bar()(以下のサンプル アプリ) を考えると、ここで何を_Tp解決_Class::*するのでしょうか?

以下は、メンバー関数ポインターとオブジェクトをバインドするサンプル アプリです。std::bind(メンバー関数の特殊化/内部に関連するソースコードを引き出しました)

0 投票する
1 に答える
174 参照

c++ - メソッド ポインターと派生型のオブジェクトを提供する場合の std::bind の適合性

この質問は基本的に、私が与えたこの回答の余波です。標準の文言では、いくつかのケースが省略されているように見えることに気付きました。次のコードを検討してください。

標準では、20.8.9.1.2 で、その効果とstd::bind、それが呼び出されたときに何が起こるかについて説明しています。20.8.2 に転送されます。関連する部分は次のとおりです。

20.8.2 要件 [func.require]

1 INVOKE(f, t1, t2, ..., tN)を次のように定義します。

(t1.*f)(t2, ..., tN)fクラスのメンバ関数へのポインタでありTt1Tのオブジェクト、型のオブジェクトへのT参照、または から派生した型のオブジェクトへの参照である場合T

((*t1).*f)(t2, ..., tN)fクラスのメンバ関数へのポインタでありTt1前の項目で説明した型のいずれでもない場合。

—およびt1.*fがクラスのメンバ データへのポインタであり、が型のオブジェクト、または型のオブジェクトへの参照、または から派生した型のオブジェクトへの参照である場合。N == 1fTt1TTT

— and(*t1).*fがクラスのメンバ データへのポインタであり、前の項目で説明した型のいずれでもない場合。N == 1fTt1

f(t1, t2, ..., tN)その他のすべての場合。

これを読むと、最初のリスト項目に 3 つのケースが許可されているようです。

  • t1型のオブジェクトですT
  • または型のオブジェクトへの参照T
  • またはから派生した型のオブジェクトへの参照T

しかし、私の例では、どちらでもありません。から派生した型Tですが、参照はありません。上記のケースは次のとおりではありません。

  • t1型のオブジェクトですT
  • またはから派生した型のオブジェクトT
  • または型のオブジェクトへの参照T
  • またはから派生した型のオブジェクトへの参照T

もちろん、同じことが 20.8.2 の 3 番目のリスト項目にも当てはまります。

質問 1: GCC と Clang の両方が私のコードを受け入れるので、これは標準に対する欠陥レポートなのか、それとも私の読み方が間違っているだけなのか疑問に思います。

質問 2:多重/仮想継承では、型が から派生したものであっても、T単純に呼び出すことができない場合があり(t1.*f)(...)ますよね? それも私が懸念すべきことですか、それとも標準は特定のコンテキストで「派生元」を明確に定義していますか?

0 投票する
4 に答える
1969 参照

c++ - _0 ではなく std::placeholders::_1 から始めるのはなぜですか?

C++ のほとんどすべては 0 ベースであり、1 ベースではありません。好奇心から、なぜプレースホルダーは 1 ベースなのですか? つまり、_0 ではなく _1 が最初のパラメーターです。

0 投票する
1 に答える
5090 参照

c++ - std :: bind-Visual Studioで予期しない(宣言されていない識別子)エラーをコンパイルする

std :: bindを正しく理解していれば、もう1つの厄介なエラーメッセージが表示されます。引数は、指定_1されていない引数を定義するのが好きですか?右?次の行をよく考慮してください。

これはうまくいくはずですよね?これはstd::find_if()関数に使用されます。そのため、最初の引数は値型で、2番目は文字列である必要があります。

ただし、Visual Studio 2010は、次のエラーメッセージでこれについて文句を言います。

エラーC2065:'_1':宣言されていない識別子

それは奇妙なことです。ビジュアルスタジオで「最初の議論は束縛されていません」とどうやって言うことができますか。Predは、value_type, const std::string&引数としてブール値を返す単純な関数です。

0 投票する
1 に答える
1368 参照

c++ - 参照によって渡された抽象クラスでバインドを使用する方法

ループを単純化するために、std::transformをstd::bindと一緒に使用しようとしています。ここにいくつかのコードがあります:

これはコンパイルされません。

VS2008 SP1を使用していますが、理解できないテンプレートエラーが多数発生したため、ideone (gcc 4.7.2)で試してみました。そこで、より読みやすいエラーがいくつかあり、それはITestが抽象的であることに関係していると結論付けました。

しかし、私はテストオブジェクトに合格する方法を変更してみました。ポインターでそれを行うと、機能します。

では、ループの代わりに、関数のシグネチャを保持し、バインドで変換を使用するために使用できるものはありますか?

0 投票する
1 に答える
731 参照

c++ - 可変個引数のテンプレートと型リストを使用して、不透明な配列を関数の引数にマッピングする

TLTR : 可変個引数テンプレートのリストに格納されたインデックスによって定義された特定の順序に従って、テンプレート コンテナーから関数の引数にいくつかの配列をマップしたいと思います (問題を定義するより簡単な方法は考えられません)。

配列は使用して格納されvoid*ますが、配列と関数パラメーター間のタイプ セーフはヘルパー クラスによって保証されます。同じヘルパー クラスが、指定されたパラメーター パックを展開し、適切な配列をフェッチし、それらを関数ポインターにバインドして、関数を呼び出す必要があります。これは私が立ち往生しているところです。

詳細: 長い質問とコンパイルされないコードの投稿について事前にお詫びしますが、できるだけ簡潔にしようとしました。

問題は、コンテナーの適切なメンバーをファンクター オブジェクトにマッピングすることにあります。コンテナにはtypelistによって定義された配列のリストがあり、その実装はこれと似ています。

簡単にするために、typelist ヘルパー オブジェクトTLAlg::length<TL>TLAlg::TypeAtが定義されていると仮定し、ユーザーが typelist の長さと N 番目の型にそれぞれアクセスできるようにします。

コンテナー クラスは、型リスト (フィールドと呼ばれる) 内の型ごとに配列を割り当て、これらのバッファーへの不透明なポインターを格納します。特定のフィールド インデックスにアクセスするために、タイプセーフな getter が実装されています。その実装は次のとおりです。

Functorタイプリストの特定のサブセットを使用して、ボリュームに特定の機能を適用するオブジェクトを実装したいと考えています。配列を直接操作する代わりに、ユーザーは、アクセスしたいフィールドのインデックスのリストと、適用する関数へのポインターを提供します。functor オブジェクトは、正しい引数を設定する責任があります。

型の安全性を高めるために、これらを読み取り専用と読み取り/書き込み ( readconstと not const) の 2 つのリストに分けます。指定された関数プロトタイプは、ファンクター オブジェクトの定義と一致する必要があります。コードは、指定された関数ポインターが引数の定義と正確に一致する場合にのみコンパイルされるため、型の不一致について心配する必要はありません。ファンクターの実装は次のとおりです。

ご覧のとおり、2 つのパラメーター パックをコンテナー配列にマップし、それらを関数ポインターにバインドする方法がわからないため、ファンクターは現時点では何もしません...

わかりやすくするために、ファンクター クラスの使用例を次に示します。

std::forwardandstd::bindで長い間遊んでみましたが、まだ正しい解決策を得ることができません。typelist を置き換えるstd::tupleことも考えられますが、現在の定義を維持することが望ましいです。

このコードは奇妙で不必要に複雑に見えるかもしれませんが、これらのクラスを使用する意味のある大規模なフレームワークの非常に単純化されたバージョンです。

どんな助けでも大歓迎です。

Yakk の回答の説明:

私はより多くの魔法を使っているので、タイプリストが必要です。たとえば、リストの各要素は、名前を関連付けるために単一のタイプではなくタプルにすることができます。これにより、次のようなきちんとしたコードが可能になります。

これが、ファンクターで実装したい種類の操作とどのようにうまく組み合わされているか想像できます。

第二に、ゲッターで混乱した理由がわかりました。最初に言ったように、非常に長い質問にもかかわらず、これはコードの非常に単純化されたバージョンです。実際のプログラムでは、ボリュームは多次元であり、単一の配列にフラット化されるか、多次元配列に割り当てられます。これが、ゲッターが完全な座標を必要とする理由です。これらのゲッターには、さまざまなパラメーターを持ついくつかの実装があります。

最後に、Functor 自体が反復空間を制御し、定義済みのスケルトン (つまり、ステンシル、波面など) を適用するため、関数を適用する要素を知る必要はありません。繰り返しますが、簡単にするために省略しました。