接近STL算法,lambda,本地类和其他方法

时间:2008-11-02 05:29:20

标签: c++ stl lambda

使用STL似乎需要的一件事是指定本地函数的方法。 我通常提供的许多函数都不能使用STL函数对象创建工具(例如bind)创建,我必须手动滚动我的函数对象。

由于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委员会的人也这么认为,并将一个lambda添加到C ++中。

与此同时,编译器如何解决这个问题? (特别是Windows编译器。)

可能会澄清一点的修正。 更新日志: 11月2日 取而代之的是澄清 由于C ++标准禁止将本地类作为函数对象

3 个答案:

答案 0 :(得分:4)

标准方式是“仿函数” - 基本上是struct提供operator()

例如:

struct MyMinFunctor {
  bool operator()(const int& a, const int& b) { return a > b; }
};

vector<int> v;
sort(v.begin(), v.end(), MyMinFunctor());

因为它是一个struct / class,所以你可以继承任何类似'binary_operator'的东西,并为更高级的仿函数维护状态。

答案 1 :(得分:1)

使用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. 定义函数运算符重载
  4. 有些算法需要二进制函数对象,而有些算法需要一元函数对象。请参阅供应商的STL文档,以确切了解哪些算法需要二进制函数对象以及哪些算法需要一元函数对象。

    您可能还想要研究的一件事是TR1中bindfunction的较新实现(基于Boost.Bind和Boost.Function)。

答案 2 :(得分:1)

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