[解決済み] 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
は(明らかに)ポインタではありません。
なぜ純粋なifが動作するのでしょうか?その背後にある魔法は何ですか?そして、それをチェックする方法は正しいのでしょうか?
どのように解決するのですか?
ラムダが空であるかどうかではなく
std::function
に呼び出し可能なターゲットが格納されているかどうかをチェックしているのです。このチェックはよく定義されており、動作するのは
std::function::operator bool
への暗黙の変換を可能にする
bool
への暗黙の変換を可能にします。
if
文の条件式など)。
そのほかにも
空のラムダ
という概念も、実は意味をなさない。裏側では、コンパイラはラムダ式を
struct
(または
class
) の定義で、キャプチャした変数はこの
struct
. また、パブリックな関数呼び出し演算子も定義されており、これでラムダを呼び出すことができるようになっています。では、空のラムダはどうなるのでしょうか?
と書くこともできます。
if(eventFunc != nullptr)
と書くことも可能です。
std::function
は定義しています。
operator==
そして
operator!=
との比較のためのオーバーロード。
nullptr_t
.
関連
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み] 関数からunique_ptrを返す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の