代码之家  ›  专栏  ›  技术社区  ›  BubbaT

STL算法、lambda、局部类等方法的探讨

  •  2
  • BubbaT  · 技术社区  · 17 年前

    使用STL似乎有必要的事情之一是指定局部函数的方法。

    因为C++标准禁止本地类型用作模板实例化中的参数,所以我所能使用的最好的方法是创建一个小的库,(只显示相关的部分)

    // library header
    class MyFunctionBase<R,T>  
    {  
     public:  
       virtual ~MyFunctionBase();  
       virtual R operator()(const T &) const=0;  
    };    
    
    
    class  MyFunction<R,T> 
    {   
        MyFunctionBase<R,T> *b; 
     public: 
        ~MyFunction()
        {
           delete b;
        }
        virtual R operator()(const T &) const
        {
            return (*b)(T);
        } 
    };
    
    
    // source file
    ....
    
        class func: public MyFunctionBase  ...
        std::stl_alg(....    MyFunction(new funct));
    

    这在我看来总是很难做到。我想ISO委员会的人也相信,并向C++添加了一个lambda。

    可能会澄清一点的更正。 11月2日 替换以澄清 因为C++标准禁止本地类作为函数对象

    3 回复  |  直到 17 年前
        1
  •  4
  •   hazzen    17 年前

    标准方法是一个“函子”——基本上是一个 struct 这提供了一个 operator()

    例如:

    struct MyMinFunctor {
      bool operator()(const int& a, const int& b) { return a > b; }
    };
    
    vector<int> v;
    sort(v.begin(), v.end(), MyMinFunctor());
    

        2
  •  1
  •   Dean Michael    17 年前

    使用C++0x可以使用lambda(如您所述):

    for_each(container.begin(), container.end(),
      [](auto item) {
        // do something with item
      }
      );
    

    这已经在MS Visual C++ 2010(当前在社区技术预览)和GCC 4.3。X中可用(带有-STD+C++ 0x编译器标志)。但是,如果没有lambda,您只需要提供一个类型:

    1. 默认值是可构造的吗
    2. 复制是可构造的吗
    3. 定义函数运算符重载

    有些算法需要二进制函数对象,而有些算法需要一元函数对象。请参阅供应商的STL文档,了解哪些算法需要二进制函数对象,哪些算法需要一元函数对象。

    bind function 在TR1中(基于Boost.Bind和Boost.Function)。

        3
  •  1
  •   user21714    17 年前

    Boost.Bind、Boost.Function和Boost.Lambda是你的朋友。