問題タブ [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.
java - 最高の Java Functor ライブラリ: JGA、commons functor、mango、または...?
Java でファンクター (関数オブジェクト) を使用することに興味があります。簡単なグーグル検索で、次の 3 つのパッケージが見つかりました。
- Java ジェネリック アルゴリズム: http://jga.sourceforge.net/
- Commons ファンクター: http://commons.apache.org/sandbox/functor/
- マンゴー: http://www.jezuk.co.uk/cgi-bin/view/mango
そして3つのうち、JGAが最高のデザインを持っているように見えました. しかし、実際に 1 つまたは複数のパッケージを使用したことがある他のユーザーは、これらの (およびおそらく他の) ファンクター パッケージの長所と短所についてより多くの洞察を提供できるのではないかと思います。
c++ - ラムダコレクションサイズの評価を後押し
私は次の形式の関数を持っています:
この関数はいくつかの作業を行い、条件が真の場合にのみ戻ります。コールサイトごとに異なる条件を提供したいので、条件はファンクター引数として表現されています。
さて、これを直接使用するのはかなり簡単ですが、多くの小さな使い捨て関数またはファンクターオブジェクトを宣言する必要があります。これは、可能であれば避けたいと思います。私はこれらをなくすための可能な方法についてBoostのラムダライブラリを調べてきましたが、基本的なものが欠けていると思います。やりたいことができない。
現時点で私を困惑させている1つのケース:私は;std::vector
と呼ばれるコレクションを持っています。data
私が求めているのはsize()
、そのコレクションのが特定のしきい値に達したときです。基本的に、condition
ファンクターがtrueを返し、それ以外のdata.size() >= threshold
場合はfalseを返すようにします。しかし、ラムダ構文でそれを表現するのに苦労しています。
私がこれまでに思いついた最高のもの(少なくともコンパイルされますが、動作しません)は次のとおりです。
に入るとDoSomething
、サイズは0になります。実行中にサイズが大きくなっても、呼び出しはcondition()
常にサイズが0になるように見えます。これをトレースすると(Boostの内部では少し注意が必要です)、評価されるgreater_equal
たびに呼び出しているように見えますが、呼び出してcondition()
いるようには見えませんsize()
。
それで、私が完全に台無しにした基本的なことは何ですか?この種のことを表現するためのより簡単な方法はありますか(コードを可能な限りインラインに保ちながら)?
理想的には、C#と同等のコードの流暢さにできるだけ近づけたいと思います。
c++ - このサンプルが機能する理由
sort_by_polar_angle() が呼び出されると、コンストラクタとして機能しますか? オーバーロードされた演算子 () はどのように正しく使用されましたか?
c++ - g++ は、単純なファンクターを「型が必要で、'xyz' を取得しました」で拒否します
私はC++でファンクターをいじっています。特に、ペアの最初の要素でソートしたいペアのベクトルがあります。私は完全に特殊化されたファンクター (つまり、"bool MyLessThan(MyPair &lhs, MyPair &rhs)" のようなもの) を書き始めました。次に、この種のものが興味深いという理由だけで、一般的な「このペアの最初の要素に F を適用する」ファンクターを書いてみたかったのです。以下に書いたのですが、g++ が苦手です。私は得る:
エラー: 'template struct Pair1stFunc2' のテンプレート パラメーター リストの引数 2 で型/値が一致しません エラー: 型が必要ですが、'less' が得られました
ここで私が間違っていることに誰かが光を当てることができますか? これは少し人為的な例であることはわかっていますが、STL-fu を改善するためだけに、何が起こっているのか知りたいです。
c++ - 任意のリターンタイプと任意のパラメータを持つ導来関手
ファンクターを作業単位として使用するクラスがあります。Run()メソッドでファンクターへの参照を受け入れます。このクラスが任意のファンクターで動作できるようにするには、これらすべてのファンクターは、次のような基本ファンクタークラスから派生する必要があります。
これは機能しますが、明らかに、これらのファンクターを、voidを返し、パラメーターを受け入れない演算子メソッドを持つように制限します。クラスで、任意のタイプのパラメーターを受け取り、何でも返すことができるファンクターを受け入れることができる必要があります。それは明らかに実行可能ですが、私はそれを行う方法を見つけることができないようです。テンプレート、多重継承の使用を検討しましたが、このファンクターを実行する必要のあるクラスは任意の型を受け入れることができなければならないため、基本クラスの型を受け入れるため、実際の型がわからないという事実に悩まされ続けています関手の。
どの道を見るべきかについての提案をいただければ幸いです。
java - 再利用可能な条件/式クラス
条件を表現および操作するためのクラスが何度か必要になりました(通常はUIで、ユーザーがさまざまな条件タイプを組み合わせてクエリを作成すると、コードは、クエリ対象の基になるシステムに応じて、たとえばluceneやdb)。再利用可能なクラスのセットをあちこち検索しました。これは多くの既存の場所(初心者向けのすべての表現言語)で使用する必要があると確信していますが、簡単に使用できるものは見つかりませんでした。私は自分で両方の時間をコーディングすることになりましたが、確かに存在するものを再利用しないことに不満を感じました。
一般的なニーズは次のとおりです。-いくつかの演算子:およびまたはなど-可変数のオペランド-式を作成するための条件の組み合わせ-式のシリアル化-文字列との間の式の解析/フォーマット
誰かがそのようなものを見つけましたか?
c++ - newとdeleteを使用しても、ファンクターの構築とオーバーヘッドはゼロですか?
状態のないファンクタークラスがあるが、新しいものを使用してヒープから作成する場合、一般的なコンパイラーは、作成のオーバーヘッドを完全に最適化するのに十分スマートですか?
この質問は、ステートレスなファンクターをたくさん作成するときに出てきました。それらがスタックに割り当てられている場合、それらの0状態のクラス本体は、スタックが実際にはまったく変更されていないことを意味しますか?後でファンクターインスタンスのアドレスを取得する場合に備えて、それが必要なようです。ヒープ割り当てについても同じです。
その場合、ファンクターは常に(些細な、しかしゼロではない)オーバーヘッドを作成に追加します。しかし、コンパイラはそのアドレスが使用されているかどうかを確認でき、使用されていない場合はそのスタック割り当てを排除できる可能性があります。(または、ヒープ割り当てを削除することもできますか?)
しかし、一時的に作成されたファンクターはどうですか?
したがって、上記の具体的な例では、3つの行はそれぞれ3つの異なる方法で同じファンクターを呼び出します。この例では、方法の間に効率の違いはありますか?または、コンパイラーは、計算のない印刷ステートメントになるまで、各行を最適化できますか?
編集:ほとんどの回答は、コンパイラがヒープに割り当てられたファンクターをインライン化/削除することはできないと言っています。しかし、これも本当に本当ですか?ほとんどのコンパイラ(GCC、MS、Intel)には、リンクタイムの最適化もあり、実際にこの最適化を行うことができます。(しかし、そうですか?)
c++ - for_each? でコンテナーの要素のメンバーのメンバー関数を呼び出す
紛らわしいタイトルです。うまくいけば、いくつかのコードが明確になります。
したがって、基本的にはコンテナの各要素でメソッドを呼び出したいのですが、実際にはその型のメソッドではなく、含まれている型のメソッドです...関数オブジェクトを記述して呼び出しを「渡す」ことができることを知っていますしかし、私が呼び出したいいくつかのメソッドがあり、それは面倒です。
何か案は?
c++ - C++ テンプレート定義のネスト
私は C++ テンプレートを少し悪用しており、何かを理解するのに苦労しています。基本型から継承する必要がある 2 つの型があるとしますが、速度上の理由から、仮想関数のオーバーヘッドを許容する余裕はありません (ベンチマークを行ったところ、仮想呼び出しによって問題が台無しになりました!)。
まず、ここに私が持っている2つのクラスがあります
典型的なooデザインでは、Class1
からClass2
継承しIInterface
、次のような関数を持つことができます
でもそれができないからこうしてしまった
Class1
それを強制して同じインターフェイスを実装するものは (コンパイラ レベルで) 何もないので、きれいではないことはわかっていClass2
ますが、速度上の理由から、いくつかのルールを破っています。
私がやりたいのは、でコールバック関数を作成することですがDoStuff
、テンプレートで機能させる方法がわかりません(特にそこに隠しがあるため.
たとえば、これは現在機能します
Class1
なぜand を使用するのClass2
か、あなたが尋ねていることがわかりました。ファイルの処理とメモリの処理の根本的な違いは非常に大きいため、(単にコンストラクターをオーバーロードして、異なる入力に対して異なる動作をさせるのではなく)、異なる種類の入力に対して異なるクラスを使用することは理にかなっています。繰り返しますが、これをベンチマークしましたが、すべての関数にcase
s/ sを含めるよりも、独自のクラスで特殊なケースを処理する方がはるかに高速です。if
したがって、私がやりたいのは、この実装の多くを後輩の開発者から隠してDoStuff
、異なる入力を処理するために 3 つの異なるオーバーロードされた s を作成する必要がないようにしたいということです。理想的には、何らかのタイプのコールバックを設定するだけで、#defines
呼び出されるクラスを作成しDoStuff
てオペレーターをオーバーロードし()
、ファンクターに作業させるだけで済みます。
私が抱えている問題DoStuff
は、作業を行う関数はテンプレート化されているだけです<class C>
が、C自体はテンプレート化されて<class DataType>
おり、すべてを一般的な方法で渡す方法がわかりません。たとえば、template <class C<DataType>>
またはは使用できませんtemplate<template< class DataType> class C>
。コンパイルされないだけです。
このネストされたテンプレート化されたクラスを使用して、関数またはファンクター (私は気にしません) のいずれかの一般的なコールバックを行うための良いトリックを誰かが持っていますか? 基本的に、データを格納しているクラスを気にしないジェネリック関数を記述し、使用するクラスを特定する最も一般的な関数によって呼び出されるものが必要です。
このようにして、私が 1 つのBigSwitch
関数を作成し、他の人に CallBack 関数を作成してもらうことができます。
何か案は?
Jalfの明確化のための編集:
2 つの非常によく似たクラスがClass1
あり、Class2
基本的に同じタイプのデータを表しますが、データ ストアは大きく異なります。より具体的にするために、単純な例を使用します。Class1
は単純な配列でありClass2
、配列のように見えますが、メモリに格納するのではなく、ファイルに格納します (大きすぎてメモリに収まらないため)。だから私は彼らMemArray
にFileArray
今すぐ電話します。では、配列の合計が必要だとしましょう。私はこのようなことができます
しかし今、実際のデータを配列にロードする方法が必要です。メモリベースの配列の場合は、これを行います
ファイルベースの場合は、これを行います
これらの呼び出しは両方とも有効です (コンパイラはコンパイル時に両方のコード パスを生成するため)。
これはすべて、DataType が何であるかを知っていることを前提としていますが、ファイル ベースの配列の場合、ファイルを開いてヘッダーをクエリして配列内のデータの種類を知るまで、データ型がわからない場合があります。
これはすべて機能しますが、オーバーロードされた 2 つGetX
の関数と、X
実行したいすべての関数を記述する必要があります。関数は、呼び出すGetX
を除いて、基本的に毎回同じコードX
です。だから私は次のようなものを書くことができるのが大好きです
私が電話できるように
その後、他の誰かが新しい関数を追加したい場合は、関数を記述して呼び出すだけです。
実際のアルゴリズムから入力/ストレージを抽象化できるように、オーバーロードされたGetX
関数と関数を記述する方法を探しています。X
通常、これは難しい問題ではありません。X
関数自体にテンプレート化されたテンプレート引数が含まれているため、問題が発生しているだけです。そこtemplate<class ArrayType>
には暗黙のArrayType<DataType>
隠し要素もあります。コンパイラはそれについて不満です。
c++ - 関数なしの std::sort
std::sort アルゴリズムについて質問があります。ここに私のテストコードがあります:
m_first
スタンドアロンの関数やファンクターを使用せずに変数のベクトルをソートすることは可能ですか? また、ブーストを使用していないことに注意してください。