c++boost.gif (8819 bytes)HomeLibrariesPeopleFAQMore

Class template function

boost::function — コールバックや関数オブジェクトのラップに使える、関数ポインタを一般化したもの。

Synopsis

template<typename Signature,   // Function type R (T1, T2, ..., TN)
         typename Allocator = std::allocator<void> > 
class function : public functionN<R, T1, T2, ..., TN, Allocator> {
public:
  // 型
  typedef R         result_type;         
  typedef Allocator allocator_type;      
  typedef T1        argument_type;         // If N == 1
  typedef T1        first_argument_type;   // If N == 2
  typedef T2        second_argument_type;  // If N == 2
  typedef T1        arg1_type;           
  typedef T2        arg2_type;           
     .
     .
     .
  typedef TN        argN_type;           

  // 静的定数
  static const int arity = N;

  // 構築/コピー/破棄
  function();
  function(const functionN&);
  function(const function&);
  template<typename F> function(F);
  function& operator=(const functionN&);
  function& operator=(const function&);
  ~function();

  // 変更
  void swap(const function&);
  void clear();

  // 能力
  bool empty() const;
  operator safe_bool() const;
  bool operator!() const;

  // 実行
  result_type operator()(arg1_type, arg2_type, ..., argN_type) const;
};

// 特殊化されたアルゴリズム
template<typename Signature, typename Allocator> 
  void swap(function<Signature, Allocator>&, function<Signature, Allocator>&);

// 未定義の演算子
template<typename Signature1, typename Allocator1, typename Signature2, 
         typename Allocator2> 
  void operator==(const function<Signature1, Allocator1>&, 
                  const function<Signature2, Allocator2>&);
template<typename Signature1, typename Allocator1, typename Signature2, 
         typename Allocator2> 
  void operator!=(const function<Signature1, Allocator1>&, 
                  const function<Signature2, Allocator2>&);

Description

クラステンプレート function は、番号付きクラステンプレート function0, function1, ... の薄いラッパである。 N 個の引数を持つ関数型を渡されれば、 functionN (引数 N 個専用のクラス) から派生する。 クラステンプレート function のメンバ関数のセマンティクスは、全て基底となる functionN オブジェクトと同じである。ただし、 function オブジェクトの正しいコピーコンストラクトやコピーの代入のために、追加のメンバ関数を定義している。

function 構築/コピー/破棄

  1. function();

    事後条件: this->empty()
    例外: 例外は発生しない。

  2. function(const functionN& f);

    事後条件: f が空でなければ、 f が格納する関数オブジェクトのコピーを格納する。 f.empty() ならば、空になる。
    例外: f が格納する関数オブジェクトのコピーで例外が発生しない限り、例外は発生しない。

  3. function(const function& f);

    事後条件: f が空でなければ、 f が格納する関数オブジェクトのコピーを格納する。 f.empty() ならば、空になる。
    例外: f が格納する関数オブジェクトのコピーで例外が発生しない限り、例外は発生しない。

  4. template<typename F> function(F f);

    必須事項: F は this から呼び出し可能な関数オブジェクトでなければならない。
    事後条件: f が空でなければ、 *thisf のコピーを格納する。 f が空ならば、 this->empty() が真になる。
    例外: f が状態を持たない関数オブジェクトならば、例外を発生しない。

  5. function& operator=(const functionN& f);

    事後条件: f が空でなければ、 *thisf が格納する関数オブジェクトのコピーを格納する。 f.empty() ならば、空になる。
    例外: f が格納するものが状態を持たない関数オブジェクトか関数オブジェクトへの参照ならば、例外を発生しない。

  6. function& operator=(const function& f);

    事後条件: f が空でなければ、 *thisf が格納する関数オブジェクトのコピーを格納する。 f.empty() ならば、空になる。
    例外: f が格納するものが状態を持たない関数オブジェクトか関数オブジェクトへの参照ならば、例外を発生しない。

  7. ~function();

    作用: !this->empty() ならば、格納する関数オブジェクトを破棄する。

function 変更

  1. void swap(const function& f);

    作用: *thisf の格納する関数オブジェクトを交換する。
    例外: 例外は発生しない。

  2. void clear();

    事後条件: this->empty()
    例外: 例外は発生しない。

function 能力

  1. bool empty() const;

    戻り値: this が空ならば true 、そうでなければ false
    例外: 例外は発生しない。

  2. operator safe_bool() const;

    戻り値: this->empty() ならば bool 型の文脈で false と評価される safe_bool 型の値、そうでなければ true と評価される値。
    例外: 例外は発生しない。

  3. bool operator!() const;

    戻り値: this->empty()
    例外: 例外は発生しない。

function 実行

  1. result_type operator()(arg1_type a1, arg2_type a2, ... , argN_type aN) const;

    作用: f(a1, a2, ..., aN) が実行される。ここで f*this が格納する関数オブジェクト。
    戻り値: Rvoid ならば、何も返さない。そうでなければ、 f の呼び出しの戻り値を返す。
    例外: !this->empty() ならば bad_function_call が発生する。そうでなければ、格納する関数オブジェクトが発生するどんな例外も発生する可能性がある。

function 特殊化されたアルゴリズム

  1. template<typename Signature, typename Allocator> 
      void swap(function<Signature, Allocator>& f1, 
                function<Signature, Allocator>& f2);

    作用: f1.swap(f2)
    例外: 例外は発生しない。

function 未定義の演算子

  1. template<typename Signature1, typename Allocator1, typename Signature2, 
             typename Allocator2> 
      void operator==(const function<Signature1, Allocator1>& f1, 
                      const function<Signature2, Allocator2>& f2);

    Notes: この関数は未定義のままにしておかなければならない。
    Rationale: safe_bool への型変換が 2 つの関数インスタンスを == で比較可能にする抜け穴を作っている。この未定義の void operator == がその抜け穴を閉じ、確実にコンパイル時エラーやリンカエラーになるようにしている。

  2. template<typename Signature1, typename Allocator1, typename Signature2, 
             typename Allocator2> 
      void operator!=(const function<Signature1, Allocator1>& f1, 
                      const function<Signature2, Allocator2>& f2);

    Notes: この関数は未定義のままにしておかなければならない。
    Rationale: safe_bool への型変換が 2 つの関数インスタンスを != で比較可能にする抜け穴を作っている。この未定義の void operator != がその抜け穴を閉じ、確実にコンパイル時エラーやリンカエラーになるようにしている。

Last revised: February 19, 2003 at 22:46:09 GMTCopyright © 2001-2003 Douglas Gregor