19

エラー状態を報告するためのコールバックとして、オプションのboost::function引数を取りたい関数があります。デフォルト値を使用してオプションにすることができる特別な値はありますか?

たとえば、通常の関数ポインタを使用すると、次のことができます。

void my_func(int a, int b, t_func_ptr err_callback=NULL) {

   if (error && (err_callback != NULL))
      err_callback();

}

関数ポインタを置き換えるboost::functionで同様のことを行うことはできますか?

4

2 に答える 2

27

0boost :: function引数のデフォルト値に(C ++と同等の)を使用できNULLます。これにより、関数オブジェクトが空になります。empty()メソッドを呼び出すか、0と比較するか、ブール値のコンテキストで使用することで、空かどうかをテストできます。

void my_func(int a, int b, boost::function<void()> err_callback = 0) {
   if (error && err_callback)  // tests err_callback by converting to bool
      err_callback();
}

boost::functionこの点で、オブジェクトは単純な関数ポインタとほとんど同じように機能します。

于 2010-02-25T22:39:31.487 に答える
13

適切な特別な値は、デフォルトで構築されたものである可能性がありますboost::function

functionはブールコンテキスト(NULLポインターなど)でfalseと評価されます。または、empty()メソッドを使用して、関数オブジェクトラッパーに実際に関数が含まれているかどうかをテストできます。boost::functionチュートリアルを参照してください。

コードサンプルは次のとおりです。

#include <boost/function.hpp>
#include <iostream>

typedef boost::function<void (int code)> t_err_callback;

void do_callback(int code)
{
    std::cout << "Error " << code << std::endl;
}

void my_func(int a, int b, t_err_callback err_callback=t_err_callback())
{
    bool error = true;   // An error happened
    int error_code = 15; // Error code
    if (error && !err_callback.empty())
        err_callback(error_code);
}

int main()
{
    my_func(0, 0);
    my_func(0, 0, do_callback);
}
于 2010-02-25T22:45:47.033 に答える