問題タブ [function-object]
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++ - クラスメンバー関数内での関数オブジェクトの宣言と定義
クラスメンバー関数内で関数オブジェクトを定義して、たとえば std::transform 関数で直接使用できるかどうか、またどのようにできるか疑問に思います。
例が少しばかげていることはわかっています。これは、私が直面している問題を示すためのものです。
ファイル「example.h」
ファイル「example.cpp」
「example.cpp」のように関数オブジェクトをメンバー関数内に直接実装しようとして以来、コードはコンパイルされません。私が得るエラーメッセージは次のとおりです。
したがって、std::transform で構造体「ファンクター」を使用すると問題が発生すると思います。誰かが私に何が問題なのか教えてもらえますか?
使用:
Ubuntu Linux での gcc-4.2 コンパイラ。
前もってありがとう、
ルネ。
c++ - テンプレート内の関数テンプレート パラメーターの結果型にアクセスしますか?
次のテンプレートがあるとします。
... およびそのインスタンス化は、おそらく次のようになります。
、関数記述の戻り値の型にアクセスし、それに対して条件付きでコンパイルする方法はありますか? たとえば、呼び出し元が自分の関数が bool を返すように指定した場合 (上記の場合のように)、値を返す関数を含めたいと思います。彼が関数が無効であると指定した場合、この関数を含めたくありません。例えば:
ここに解決策があると思いますが、おそらく、恐ろしく難読化されたテンプレート メタプログラミング ソリューションが関係しています。Gregor Cantor が無限を考えて発狂したことは知っています... テンプレートのメタプログラミングのようなものは、私にも同じ影響を与えます :p.
ご意見ありがとうございます。
ロビンソンT
編集: 明らかに、これは別のクラス (おそらく共通のベースから派生) を実装することで解決できます。1 つは VoidContainer と呼ばれ、もう 1 つは ReturnsContainer (または類似) と呼ばれます。しかし、これは私には少し物足りないようです...
c++ - std :: functionのテンプレートパラメータはどのように機能しますか?(実装)
Bjarne Stroustrupのホームページ(C ++ 11 FAQ):
それはどのように機能しますか?std :: functionはどのようにfooメンバー関数を呼び出しますか?
テンプレートパラメータはint(X*, int)
、メンバー関数ポインタから非&X::foo
メンバー関数ポインタに変換されますか?!
明確にするために: std :: functionを使用するためにポインターをキャストする必要がないことは知っていますが、 std::functionの内部がメンバー関数ポインターと非メンバー関数の間のこの非互換性をどのように処理するかはわかりませんポインタ。標準でstd::functionのようなものを実装する方法がわかりません!
javascript - JSON の解析 - eval() または関数オブジェクト?
JSON を解析するには、ブラウザーでネイティブの JSON サポートを使用するのが最善の方法だと思います。
ネイティブの JSON サポートが利用できない場合に JSON を解析する良い方法を探していました。
https://github.com/douglascrockford/JSON-js/blob/master/json2.jsのコードを見たとき、正規表現を使用してデータが有効な JSON であるかどうかを最初に確認することを理解しました。
そして、eval() を適用します。
jQuery は、最初に上記の正規表現を使用して $.parseJSON() を実行し、有効な JSON であるかどうかを確認してから適用します。
ネイティブ JSON が利用可能な場合はそれを使用し、それ以外の場合は「新しい関数」を使用します。
JSON の解析に関数オブジェクトを使用することについて、他に見つけた場所はありません。eval() を使用する方法と関数オブジェクトを使用する方法のどちらが優れていますか? 正確に何を実行するのか説明できます(new Function("return " + data))();
か?
c++ - ファンクターの呼び出しと関数呼び出しの詳細な違いは?
これが機能する主な理由は、 for_each () が実際には 3 番目の引数が関数であると想定していないためです。3 番目の引数は、適切な引数で呼び出すことができるものであると単純に想定しています。適切に定義されたオブジェクトは、機能と同様に機能し、多くの場合、機能よりも優れています。たとえば、関数へのポインターとして渡される関数をインライン化するよりも、クラスのアプリケーション演算子をインライン化する方が簡単です。その結果、関数オブジェクトは通常の関数よりも高速に実行されることがよくあります。アプリケーション演算子 (§11.9) を持つクラスのオブジェクトは、関数型オブジェクト、ファンクター、または単に関数オブジェクトと呼ばれます。
[Stroustrup、C++ 第 3 版、18.4-最後の段落]
operator()呼び出しは、実行時の関数呼び出しと同じだとずっと思っていました。通常の関数呼び出しとどう違うのですか?
通常の関数よりもアプリケーション演算子をインライン化する方が簡単なのはなぜですか?
関数呼び出しよりもどのように高速ですか?
c++ - 関数オブジェクトの働きを理解するのに役立ちますか?
ウィキペディアでこのコードを見つけました
最初は、ファンクターが括弧なしで sort_ints に記載されているときに、A および B パラメーターが operator()(int A, int B) にどのように渡されるのか疑問に思いました。
次に、 A と B が sort_ints 関数内の関数オブジェクトに渡されていることがわかりました。しかし、関数のアドレスを受け取っているので、sort_ints の宣言は「ComparisonFunctor c」ではなく「ComparisonFunctor* * * c」であるべきではないでしょうか?
sort_ints 関数内で、ファンクターへの関数呼び出しは次のようになりますか?
c++ - ポリモーフィック関数オブジェクトでstd::generate / generate_nを使用するにはどうすればよいですか?
私はstd::generateを初めて使用し、それを使用してベクトルを初期化するプログラムを構築しようとしました。しかし、それは私の期待とは異なった振る舞いをしています。
私は抽象的な基本クラスを持っています:
これは(たとえば)によって拡張されます:
継承クラスのインスタンスをポインタでファクトリクラスに渡し、それをstd :: generate:の3番目の引数として使用します。
RandomAlleleは抽象クラスであるため、インスタンス化できないというエラーが表示されます。ポインタがすでに存在するのに、なぜgenerateはそれをインスタンス化する必要があるのですか?また、継承クラスRandomIntの代わりに基本クラスを使用しようとしているのはなぜですか?
std :: generateを:に置き換えると、これは正常に機能します。
しかし、なぜそれが奇妙に動作するのかを理解したいので、これを行う方法がある場合は、generateを使用したいと思います。
御時間ありがとうございます、
リス
c++ - 関数オブジェクトをdoxygenで文書化する方法は?
doxygen を使用して関数オブジェクト (別名ファンクター) をどのように文書化すればよいですか? 通常のクラスとして文書化するだけでは誤解を招くように感じます。関数オブジェクトは、呼び出し可能なクラスよりも、クロージャーを備えた関数と考える方がはるかに優れていると思います。
私の好みに合った関数オブジェクトを文書化する方法はありますか?
c++ - shared_ptr、関数オブジェクトで STL アルゴリズムを使用する
shared_ptr のセットがあり、remove_copy_if を述語用のカスタム関数オブジェクトと共に使用したいと考えています。私はそれを行うための「最良の」方法を知りませんでした。今、私はこれを機能させています:
オブジェクトがポインターを保持しないため、shared_ptr への const 参照を行うことにしました。これは、shared_ptr の余分なコピーよりも効率的であるように思われました。
オブジェクトへの const 参照を取得する方が良いようですが、コンパイルできませんでした。これに変更しましたが、うまくいきません:
g++ からの出力は次のとおりです。
それを行う別の方法、または提案はありますか?
c++ - 名前付きメソッドを持つオブジェクトよりもC++ファンクターが望ましいのはなぜですか?
私は最近、ファンクターに興奮していて、あちこちでそれらを使用しています。その後、ファンクターに 2 つの異なる操作を実行させる必要がある状況が発生し、ファンクターに別のメソッドを追加する (() 演算子をオーバーロードしない) ことを考えました。これが悪い習慣なのかどうかはわかりませんが (おそらく教えていただけますか)、オブジェクトだけでなく、そもそもなぜファンクターを使用しているのかを考えさせられました。だから私の質問は:
() 演算子のオーバーロードについて特別なことはありますか、それとも通常の名前付きメソッドを使用するよりも構文的に魅力的ですか?
アップデート:
まず、他の質問で説明されているように、ファンクターが関数ポインターよりも望ましい理由を知っています。名前付きメソッドを持つオブジェクトよりもそれらが望ましい理由を知りたいです。
第二に、ファンクターの別の名前のメソッドを使用したい場合の例について: 基本的に、グラフパーティションのモジュール性と呼ばれるものを計算する関数と、compute_modularity()
変更後のモジュール性のゲインを計算する関数の 2 つがありますパーティションのcompute_modularity_gain()
。これらの関数を同じファンクターの一部として最適化アルゴリズムに渡し、名前付き関数としてゲインを使用できると考えました。アルゴリズムに 2 つのファンクターを渡すだけではない理由は、別のファンクターとの組み合わせでのみ使用され、別のファンクターでは使用されないことを強制したいからですcompute_modularity_gain()
。compute_modularity()
compute_stability()
compute_stability_gain()
. つまり、ゲイン関数はその兄弟関数と密接に結合されている必要があります。この制約を強制する別の方法がある場合は、お知らせください。