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
(明らかに)ポインタではありません。
なぜ純粋なものが機能するのですか?その背後にある魔法は何ですか?そして、それをチェックする方法は正しいですか?
eventFunc
これはラムダではないことに注意してください。それはstd::function
です。ラムダをstd::function
sに格納できますが、同じものではありません。