2

私がこのクラスを持っているなら

class TextBox : public Widget {
public:
    void addKeyPressHandler(std::function<void (std::string)>);
private:
    std::function<void (std::string)> keyPressHandler;
};

keyPressHandlerが設定されているかどうかはどうすればわかりますか?NULLに初期化してから、それに対してテストできますか?

4

3 に答える 3

4

operator boolメンバー関数を使用できます

20.8.11.2.3機能容量[func.wrap.func.cap]

explicit operator bool() const noexcept;

戻り値:*これにターゲットがある場合はtrue、それ以外の場合はfalse。

#include <iostream>
#include <functional>
int
main ()
{
        std::function<void()> f;

        std::cout << (bool) f << std::endl;

        f = [](){};
        std::cout << (bool) f << std::endl;
}
于 2012-12-14T19:41:29.533 に答える
3

std::functionを介して呼び出し可能なターゲットを保持しているかどうかをテストできますoperator bool()

例えば:

if (keyPressHandler)
{
    keyPressHandler(someString);
}
else
    // TODO: Consider queuing events here if you don't want to miss keystrokes.
}

...有効なターゲットがある場合にのみ関数を呼び出します。これは、初期化されてから関数ポインタまたはその他の呼び出し可能なものが割り当てられていることを意味します。

于 2012-12-14T19:40:16.083 に答える
1

ブールコンテキストでテストすることもできます(他の回答の状態として)

if (keyPressHandler)
    ...

またはあなたはそれを比較することができますnullptr

if (keyPressHandler != nullptr)
    ...

もちろん、自分でドキュメントを検索する方が、質問して回答を待つよりも迅速でした。ショーン・クラインがリンクしているドキュメントから、operator bool()「有効なターゲットが含まれているかどうかをチェックする」ことはかなり明らかです。

于 2012-12-14T19:49:06.360 に答える