Boost C++ 库

……在世界上最受推崇、设计最精良的 C++ 库项目中之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

参考 - Boost C++ 函数库
PrevUpHomeNext

参考

定义

  • 对于给定的参数类型集 Arg1, Arg2, ..., ArgN 和返回类型 ResultType,如果下面的适当函数是良构的,则函数对象 f 被称为 兼容

      // if ResultType is not void
      ResultType foo(Arg1 arg1, Arg2 arg2, ..., ArgN argN)
      {
        return f(arg1, arg2, ..., argN);
      }
    
      // if ResultType is void
      ResultType foo(Arg1 arg1, Arg2 arg2, ..., ArgN argN)
      {
        f(arg1, arg2, ..., argN);
      }
    

    对指向成员函数的指针做出了特别规定。尽管它们不是函数对象,但 Boost.Function 会在内部将它们适配为函数对象。这要求将形式为 R (X::*mf)(Arg1, Arg2, ..., ArgN) cv-quals 的指向成员函数的指针适配为具有以下函数调用运算符重载的函数对象。

      template<typename P>
      R operator()(cv-quals P& x, Arg1 arg1, Arg2 arg2, ..., ArgN argN) const
      {
        return (*x).*mf(arg1, arg2, ..., argN);
      }
    

  • 类型为 F 的函数对象 f 被称为 无状态,如果它是函数指针或者 boost::is_stateless<F> 为 true。从无状态函数对象构造或复制到 Boost.Function 对象不会引发异常,也不会分配任何存储空间。

头文件 <boost/function.hpp>

namespace boost {
  class bad_function_call;
  class function_base;
  template<typename R, typename T1, typename T2, ..., typename TN> 
    class functionN;
  template<typename T1, typename T2, ..., typename TN> 
    void swap(functionN<T1, T2, ..., TN>&, functionN<T1, T2, ..., TN>&);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator==(const functionN<T1, T2, ..., TN>&, Functor);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator==(Functor, const functionN<T1, T2, ..., TN>&);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator==(const functionN<T1, T2, ..., TN>&, 
                    reference_wrapper<Functor>);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator==(reference_wrapper<Functor>, 
                    const functionN<T1, T2, ..., TN>&);
  template<typename T1, typename T2, ..., typename TN, typename U1, 
           typename U2, ..., typename UN> 
    void operator==(const functionN<T1, T2, ..., TN>&, 
                    const functionN<U1, U2, ..., UN>&);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator!=(const functionN<T1, T2, ..., TN>&, Functor);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator!=(Functor, const functionN<T1, T2, ..., TN>&);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator!=(const functionN<T1, T2, ..., TN>&, 
                    reference_wrapper<Functor>);
  template<typename T1, typename T2, ..., typename TN, typename Functor> 
    bool operator!=(reference_wrapper<Functor>, 
                    const functionN<T1, T2, ..., TN>&);
  template<typename T1, typename T2, ..., typename TN, typename U1, 
           typename U2, ..., typename UN> 
    void operator!=(const functionN<T1, T2, ..., TN>&, 
                    const functionN<U1, U2, ..., UN>&);
  template<typename Signature> class function;
  template<typename Signature> 
    void swap(function<Signature>&, function<Signature>&);
  template<typename Signature, typename Functor> 
    bool operator==(const function<Signature>&, Functor);
  template<typename Signature, typename Functor> 
    bool operator==(Functor, const function<Signature>&);
  template<typename Signature, typename Functor> 
    bool operator==(const function<Signature>&, reference_wrapper<Functor>);
  template<typename Signature, typename Functor> 
    bool operator==(reference_wrapper<Functor>, const function<Signature>&);
  template<typename Signature1, typename Signature2> 
    void operator==(const function<Signature1>&, const function<Signature2>&);
  template<typename Signature, typename Functor> 
    bool operator!=(const function<Signature>&, Functor);
  template<typename Signature, typename Functor> 
    bool operator!=(Functor, const function<Signature>&);
  template<typename Signature, typename Functor> 
    bool operator!=(const function<Signature>&, reference_wrapper<Functor>);
  template<typename Signature, typename Functor> 
    bool operator!=(reference_wrapper<Functor>, const function<Signature>&);
  template<typename Signature1, typename Signature2> 
    void operator!=(const function<Signature1>&, const function<Signature2>&);
}
namespace boost {
  template<typename F, typename G> bool function_equal(const F&, const G&);
}

PrevUpHomeNext