タグ付けされた質問 「std-function」

7
std :: function vsテンプレート
C ++ 11のおかげでstd::function、ファンクターラッパーのファミリーを受け取りました。残念ながら、私はこれらの新しい追加について悪いことだけを聞き続けます。最も人気があるのは、ひどく遅いということです。私はそれをテストしました、そして彼らはテンプレートと比較して本当に吸います。 #include <iostream> #include <functional> #include <string> #include <chrono> template <typename F> float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; } float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; } int main() { using namespace std::chrono; const auto tp1 = system_clock::now(); for (int i …


3
C ++ 11でstd :: functionが空かどうかを適切に確認する方法
std::functionが空かどうかを適切に確認する方法を知りたいと思っていました。この例を考えてみましょう: class Test { std::function<void(int a)> eventFunc; void registerEvent(std::function<void(int a)> e) { eventFunc = e; } void doSomething() { ... eventFunc(42); } }; このコードはMSVCで正常にコンパイルされdoSomething()ますがeventFunc、コードを初期化せずに呼び出した場合、コードは明らかにクラッシュします。それは予想されますが、私は何の価値があるのeventFuncかと思っていました。デバッガは言う'empty'。だから私は単純なifステートメントを使用してそれを修正しました void doSomething() { ... if (eventFunc) { eventFunc(42); } } これは機能しますが、未初期化の値は何std::functionですか?私が書きたいと思いif (eventFunc != nullptr)ますがstd::function(明らかに)ポインタではありません。 なぜ純粋なものが機能するのですか?その背後にある魔法は何ですか?そして、それをチェックする方法は正しいですか?

4
std :: functionがオーバーロードの解決に参加しないのはなぜですか?
次のコードはコンパイルできません。 void baz(int i) { } void baz() { } class Bar { std::function<void()> bazFn; public: Bar(std::function<void()> fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } ので、std::function私は読んでの通りですが、オーバーロードの解決を考慮することはないと述べ、この他のポスト。 この種のソリューションを強制した技術的な制限を完全には理解していません。 cppreference で翻訳のフェーズとテンプレートについて読みましたが、反例を見つけることができなかった理由は思いつきません。平凡な人(まだC ++の新人)に説明すると、何がどの翻訳段階で上記のコンパイルが失敗しますか?

1
std :: function const correctness
次のような呼び出し可能なタイプがあるとします。 struct mutable_callable { int my_mutable = 0; int operator()() { // Not const return my_mutable++; } }; メンバー変数を変更するmutable_callable非定数があることに注意してくださいoperator()..... ここstd::functionで、自分のタイプからout を作成するとします。 std::function<int()> foo = mutable_callable{}; 今私はこれを行うことができます: void invoke(std::function<int()> const& z) { z(); } int main() { invoke(foo); // foo changed.....oops } 今、私の知る限りstd::functionsがoperator()あるconstごとに: https://en.cppreference.com/w/cpp/utility/functional/function/operator() だから、私の直感は、あなたがこれを行うことができないはずだということです... しかし、次に見て:https : //en.cppreference.com/w/cpp/utility/functional/function/function これは、呼び出し可能な型に定数があるかどうかに制約を課していないようですoperator()...... だから私の質問はこれです:それstd::function<int()> const&は本質的にそれと同じものであると仮定するのは正しいですstd::function<int()>&が、実際には2つの動作に違いはありません......そしてそれが事実である場合、なぜそれがconst正しくないのですか?

2
戻り値の型を明示的に述べているにもかかわらず、ラムダの呼び出しがあいまいです
オーバーロードされた関数は、ラムダのタイプが決定可能であることを前提に、両方のファンクターを取り込む必要があります(キャスト可能(std::function私が間違っている場合は修正してください)。定義されていますか?([&]() -> Type {}) 現在のソリューションでは、参照によるキャプチャが必要なため、コードにそのロジックが含まれていることに注意してください。 次の例は、問題について説明しています。 #include <iostream> #include <string> #include <functional> void do_some(std::function<void(int)> thing) { thing(5); } void do_some(std::function<bool(int)> thing) { if (thing(10)) { std::cout << "it's true!" << std::endl; } } int main() { int local_to_be_modified = 0; do_some( [&](int in) { local_to_be_modified = in; std::cout << "This …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.