問題タブ [functor]
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++ - VS2010 でのファンクター (コピー、代入) の異なる動作 (VS2005 との比較)
VS2005 から VS2010 に移行すると、ファンクターの追加コピーが原因と思われるパフォーマンスの低下に気付きました。
次のコードは、問題を示しています。値自体がセットであるマップを持つことが不可欠です。マップとセットの両方で、比較ファンクターを定義しました (例ではテンプレート化されています)。
このコードを VS2005 でコンパイルすると、次の出力が得られます。
これを VS2010 でコンパイルすると、次の出力が得られます。
最初のステートメント (マップを作成する) の出力は同じです。
2 番目のステートメント (マップ内の最初の要素を作成し、それへの参照を取得する) の出力は、VS2010 の場合ははるかに大きくなります。
- ファンクターのコンストラクターのコピー: 10 回対 8 回
- ファンクターの割り当て: 2 回 vs. 0 回
- functor のデストラクタ: 10 回 vs. 8 回
私の質問は次のとおりです。
- STL がファンクターをコピーするのはなぜですか? セットのインスタンス化ごとに 1 回構築するだけで十分ではないでしょうか?
- ファンクターがVS2005の場合よりもVS2010の場合に構築されるのはなぜですか? (VS2008はチェックしていません)
- また、VS2005 ではなく VS2010 で 2 回割り当てられるのはなぜですか?
- ファンクターのコピーを避けるためのトリックはありますか?
C++ ファンクター オブジェクトの不要なコピーを防止する で同様の質問を見ましたが、それが同じ質問かどうかはわかりません。
c++ - 引数をバインドするファンクターを作成するためのブースト方法は何ですか
2つの引数を取り、文字列を返す関数ポインタが必要です。
1つの引数を取り、文字列を返す(つまり、引数の1つを破棄する)関数をラップするアダプターを渡したいと思います。
2つの引数を取り、1つの引数だけを渡すラップされた関数を呼び出す、独自のアダプターを簡単に作成できます。
しかし、C ++ / boostで簡単に作成できる方法がある場合は、その場でアダプターを作成する簡単な方法が必要ですか?
これをもう少し具体的にするための詳細を次に示します。
明らかに、GetRowTextを適応させて2つの引数を取り、最初の引数のみをGetRowText()自体に渡すメンバーを提供できます。
しかし、それを可能にするブーストバインダー/アダプターはすでにありますか?
c++ - ネストされたプライベート構造体を使用してファンクターを作成できますか?
このクラスを考えると:
ここでの考え方は、またはFoo構造体のfooList
いずれかによってインデックスを作成できるということです。各キーでアイテムを検索できるように、渡すファンクタを作成しようとしています。しかし、クラス内でプライベートであるため、コンパイルすることはできません(Cのインターフェイスの一部ではありません)。 他の世界にさらされることなくこれを行う方法はありますか?key1
key2
std::find_if
fooList
Foo
Foo
Foo
クラス内でプライベートであるためにコンパイルされないコードの例を次に示します。
c++ - テンプレートファンクターは参照型を推測できません
関数 func と func と同じ型のパラメーター t を取るファンクター f があります。コンパイル エラーのため、g を f に渡すことができません ( の呼び出しに一致する関数がありませんf(int&, void (&)(int&))
)。g が非参照パラメーター g(int s) を取る場合、コンパイルは終了します。または、手動でテンプレート パラメータを指定するf<int&>(i, g)
と、コンパイルも終了します。
控除を機能させるにはどうすればよいですか?
c++ - 匿名の一時関数オブジェクトをテンプレート化されたコンストラクターに渡す際の問題
テンプレート化されたクラスの破棄時に呼び出される関数オブジェクトをアタッチしようとしています。ただし、関数オブジェクトを一時的に渡すことができないようです。私が得る警告は次のとおりです(コメント行の場合xi.data = 5;
):
構築されたオブジェクトを使用しようとすると、次のようなコンパイル エラーが発生します。
長いコードで申し訳ありませんが、状況を評価するにはすべてのコンポーネントを表示する必要があると思います。
私がこれを試している理由は、関数オブジェクト自体のインスタンスをクラス内に保持することなく、関数オブジェクト型をオブジェクトに「何らかの方法で」アタッチできるようにするためです。したがって、 のオブジェクトを作成するとき、 のオブジェクトclass X
をその中に保持する必要はなくclass writer
、 へのポインターのみを保持する必要があります (ここがBase<T>
必要かどうかはわかりません<T>
が、今のところそこにあります)。
問題は、のオブジェクトを作成してから、のように呼び出すのではなくwriter
、のコンストラクターに渡す必要があるように見えることですX
X<int> xi(writer();
ここで完全にばかげて明白なものを見落としている可能性があります。何か提案はありますか?
scala - Scalaでオブジェクトをモジュール/ファンクターとして使用するには?
以下に示すように、多かれ少なかれオブジェクトインスタンスをモジュール/ファンクターとして使用したい:
格子ごとに異なる微積分インスタンスを作成できるようにします (実行する操作には、格子の最大値と最小値の情報が必要です)。同じ微積分の式を混合できるようにしたいが、異なる式を混合することは許可されていません。ここまでは順調ですね。微積分インスタンスを作成できますが、問題は、それらを操作する他のクラスに関数を記述できないことです。
たとえば、ファイルから式を読み取って返すパーサーを作成しようとしています。また、ScalaCheck を使用したテストで使用するランダム式ジェネレーターを作成しようとしていました。関数が Expr オブジェクトを生成するたびに、関数の外では使用できないことがわかりました。Calculus インスタンスを作成し、Expr オブジェクトを生成する関数に引数として渡しても、関数の戻り値は、関数の外部で作成されたオブジェクトと同じ型として認識されません。
多分私の英語は十分に明確ではありません.私がやりたいことのおもちゃの例を試してみましょう.
さて、上記のコードをコンパイルしようとすると、たくさんの
次のようなことをしようとすると、同じことが起こります。
ジェネレーター自体は問題ではありませんが、システムの残りの部分で同様のこと (つまり、微積分インスタンス式の作成と操作) を行う必要があることに注意してください。
私は何か間違ったことをしていますか?私がやりたいことをすることは可能ですか?
この問題に関するヘルプは非常に必要であり、高く評価されています. よろしくお願いします。
Apocalisp から回答を受け取り、試した後。
回答ありがとうございます。ただし、まだいくつかの問題があります。提案された解決策は、関数の署名を次のように変更することでした。
関連するすべての関数 (getRndExpr、getRndVal、および getRndVar) の署名を変更しました。そして、これらの関数を呼び出すすべての場所で同じエラー メッセージが表示され、次のエラー メッセージが表示されました。
コンパイラが正しい型を判断できないように見えたので、すべての関数呼び出しを次のように変更しました。
この後、最初の 2 回の関数呼び出し (genRndVal と genRndVar) ではコンパイル エラーは発生しませんでしたが、次の 3 回の呼び出し (genRndExpr への再帰呼び出し) では、関数の戻り値を使用して新しい Expr オブジェクトを作成します。次のエラー:
だから、また行き詰まった。どんな助けでも大歓迎です。
c++ - トレイトからconstまたはnon-const参照型を取得します
void(* func)(T)型とfuncの引数argの関数をとるファンクターFを書いています。
次に、ファンクターFはargを使用してfuncを呼び出します。Fはargをコピーせず、参照として渡すだけにします。しかし、Tが参照になる可能性があるため、単純に「void F(void(* func)(T)、T&)」と書くことはできません。だから私はTの適切な参照型を取得することを可能にする特性を書き込もうとしています:
私はこのようなものを思いつきます:
たとえば、これは機能しません
エラーの発生:「voidF(void(*)(T)、typename type_op :: valid_ref_type)[with T = int]'</ p>
この特性を機能させる方法は?
c++ - 標準の削除ファンクターはありますか?
引数を削除するファンクタを探しています:
std
、tr1
またはにこのようなものはありboost
ますか?
c++ - C++構造体の並べ替えエラー
C++でカスタム構造体のベクトルを並べ替えようとしています
シンプルなファンクターで
しようとすると:
例外「無効な演算子<」が表示されます
このエラーの意味は何ですか?
ありがとう