【问题标题】:std::for_each usage on member function with two argsstd::for_each 对具有两个参数的成员函数的用法
【发布时间】:2011-09-12 19:41:11
【问题描述】:

这是我的类如何定义的一般概念(它执行的操作不是下面提到的)

struct Funktor
{
    Funktor(int val):m_val(val){}
    bool operator()(int arg1, int arg2) { return m_val==arg1*arg2; }
    int m_val;
};

现在我有一个上述对象的向量,我正在尝试使用 for_each 调用 operator(),有没有办法做到这一点?我知道可以使用 bind2nd 和 mem_func_ref 来完成,但是当只有一个参数但有两个参数时,我还没有找到方法。

int main()
{
    std::vector<Funktor> funktors;
    funktors.push_back(Funktor(10));
    funktors.push_back(Funktor(20));
    funktors.push_back(Funktor(30));

    int arg1 = 5, arg2 = 6;
    //instead of the for loop below I want to use for_each
    for(std::vector<Funktor>::iterator itr = funktors.begin(); funktors.end() != itr; ++itr)
    {
        (*itr)(arg1,arg2);
   }
}

感谢您的帮助。最好的。

简历

【问题讨论】:

  • 你能解释一下你为什么要这样做吗?它看起来实际上是一个空操作。
  • @Mark:你的意思是 operator() 什么都不做?这只是为了让我了解我的班级结构。
  • @blueskin :他的意思是std::for_each 丢弃了给定函子的结果,因此永远不会使用返回的bools,这使得这个特定的样本毫无意义。
  • 哦,对不起,这只是一个例子,我的班级并没有完全按照这里显示的那样做。谢谢

标签: c++ vector foreach functor


【解决方案1】:

C++03 解决方案(无boost):

写另一个函子为:

struct TwoArgFunctor
{
    int arg1, arg2;
    TwoArgFunctor(int a, int b) :arg1(a), arg2(b) {}

    template<typename Functor>
    bool operator()(Functor fun)
    {
        return fun(arg1, arg2); //here you invoke the actual functor!
    }
};

然后将其用作:

std::for_each(funktors.begin(),funktors.end(), TwoArgFunctor(arg1,arg2));

C++11 解决方案:

std::for_each(funktors.begin(),funktors.end(), 
                         [&] (Funktor f) -> bool { return f(arg1,arg2); });

【讨论】:

  • C++ 03 解决方案会起作用。谢谢。另外,'[&] (Funktor f) -> bool' 语法看起来很有趣,请问它到底是什么意思?
  • @blueskin:你可以在这里熟悉这个有趣的语法:en.wikipedia.org/wiki/…
  • 更具可读性的 C++11 解决方案可能是基于范围的 for 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多