c++boost.gif (8819 bytes)HomeLibrariesPeopleFAQMore

Class template functionN

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

Synopsis

template<typename R, typename T1, typename T2, ..., typename TN, 
         typename Allocator = std::allocator<void> > 
class functionN : public function_base {
public:
  // types
  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 constants
  static const int arity = N;

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

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

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

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

// 特殊化されたアルゴリズム
template<typename T1, typename T2, ..., typename TN, typename Allocator> 
  void swap(functionN<T1, T2, ..., TN, Allocator>&, 
            functionN<T1, T2, ..., TN, Allocator>&);

// 未定義の演算子
template<typename T1, typename T2, ..., typename TN, typename Allocator1, 
         typename U1, typename U2, ..., typename UN, typename Allocator2> 
  void operator==(const functionN<T1, T2, ..., TN, Allocator1>&, 
                  const functionN<U1, U2, ..., UN, Allocator2>&);
template<typename T1, typename T2, ..., typename TN, typename Allocator1, 
         typename U1, typename U2, ..., typename UN, typename Allocator2> 
  void operator!=(const functionN<T1, T2, ..., TN, Allocator1>&, 
                  const functionN<U1, U2, ..., UN, Allocator2>&);

Description

クラステンプレート functionN は実際には、 function0, function1, ... と、ある実装定義の最大値まで続く、関連するクラス群である。ここでは、 N はパラメータの数を表す。

functionN 構築/コピー/破棄

  1. functionN();

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

  2. functionN(const functionN& f);

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

  3. template<typename F> functionN(F f);

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

  4. functionN& operator=(const functionN& f);

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

  5. ~functionN();

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

functionN 変更

  1. void swap(const functionN& f);

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

  2. void clear();

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

functionN 能力

  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()
    例外: 例外は発生しない。

functionN 実行

  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 が発生する。そうでなければ、格納する関数オブジェクトが発生するどんな例外も発生する可能性がある。

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

  1. template<typename T1, typename T2, ..., typename TN, typename Allocator> 
      void swap(functionN<T1, T2, ..., TN, Allocator>& f1, 
                functionN<T1, T2, ..., TN, Allocator>& f2);

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

functionN 未定義の演算子

  1. template<typename T1, typename T2, ..., typename TN, typename Allocator1, 
             typename U1, typename U2, ..., typename UN, typename Allocator2> 
      void operator==(const functionN<T1, T2, ..., TN, Allocator1>& f1, 
                      const functionN<U1, U2, ..., UN, Allocator2>& f2);

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

  2. template<typename T1, typename T2, ..., typename TN, typename Allocator1, 
             typename U1, typename U2, ..., typename UN, typename Allocator2> 
      void operator!=(const functionN<T1, T2, ..., TN, Allocator1>& f1, 
                      const functionN<U1, U2, ..., UN, Allocator2>& f2);

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

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