18

同等のブースト機能の代わりに C++11 機能を使用するように、古いコードの一部を更新しています。ただし、順序付けされていないコンテナーやスマート ポインターのように、すべてが単純な名前空間の置き換えであるとは限りません。

たとえば、boost::functionメソッドはempty()ありますclear()が、std::functionありません。

参照を置き換えるために使用してきたoperator()定義済みの定義がありますが、参照を置き換えるには何を使用すればよいですか?std::functionempty()clear()

std::function代入演算子を使用して代入してクリアすることを検討しましたnullptrが、基になる関数だけでなく、オブジェクトを使用できなくするという意図しない副作用があるのではないかと心配しています。

明らかに、より良い解決策は、再利用可能なメンバー関数オブジェクトのデフォルトの初期化です。これにより、ユーザーが提供したもので簡単に更新できる有効なコールバックが常に存在しますが、現在は以前の使用法を直接置き換えることを目指しているだけです。コードレビュー。

4

1 に答える 1

26

置き換えるために使用してきたoperator()定義済みの forがありますstd::functionempty()

ということoperator!ですか?

そのempty演算子を使用して、ブール値のコンテキストでテストするには:

if (f.empty())

になります:

if (!f)

または

if (!f.empty())

になります:

if (f)

(これはboost::function、 と も持つoperator!で動作しoperator boolます。)

使用不可能にならないclear割り当ての場合は、デフォルトで構築された状態に設定するだけです。nullptr

f.clear();

になる

f = nullptr;

または (Paul Groke の提案に感謝):

f = {};

これは次と同等です:

f = decltype(f){};

しかし、より効率的で、入力と読み取りがはるかに簡単です。

于 2012-06-22T18:10:50.223 に答える