如何为每个循环传递成员函数?

时间:2019-01-08 23:47:51

标签: c++ class foreach

我正在尝试使用std::for_each()代替普通的for循环,但是我无法将成员函数传递给for_each()

代码如下:

class Class
{
    public :
        void func (int a)
        {
            cout << a * 3 << " ";
        }
}ob1;

int main()
{
    int arr[5] = { 1, 5, 2, 4, 3 };
    cout << "Multiple of 3 of elements are : ";
    for_each(arr, arr + 5, ob1);
}

仅当此成员函数为void operator() (int a)时,该函数才有效。我不知道为什么不能将任何其他成员函数传递给for_each()

2 个答案:

答案 0 :(得分:2)

您没有将任何类方法传递给for_each(),而是传递了一个对象,该对象仅在该对象实现operator()时有效。

要让for_each()调用您的Class::func()方法,您需要:

  • operator()在您的课程中:

    class Class
    {
    public:
        void func (int a)
        {
            std::cout << a * 3 << " ";
        }
    
        void operator()(int a)
        {
            func(a);
        }
    }ob1;
    
    std::for_each(arr, arr + 5, ob1);
    
  • 使用实现operator()的单独委托来调用您的类。

    • 您可以定义自定义函子(C ++ 11之前的版本):

      struct functor
      {
          Class &obj;
      
          functor(Class &c) : obj(c) {}
      
          void operator()(int a)
          {
              obj.func(a);
          }
      };
      
      std::for_each(arr, arr + 5, functor(ob1));
      
    • 或使用std::bind()(C ++ 11和更高版本):

      #include <functional>
      
      auto func = std::bind(&Class::func, &obj1, std::placeholders::_1);
      std::for_each(arr, arr + 5, func);
      
    • 或使用lambda(C ++ 11和更高版本):

      auto func = [&](int a){ obj1.func(a); };
      std::for_each(arr, arr + 5, func);
      

答案 1 :(得分:0)

for_each函数有几个重载,可以看到here

  

C++-std::for_each-Algorithm

     

在标题 algorithm

中定义
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f ); 
// (1) (until C++20)  

template< class InputIt, class UnaryFunction >
constexpr UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f ); 
// (1) (since C++20)  

template< class ExecutionPolicy, class ForwardIt, class UnaryFunction2 >
void for_each( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryFunction2 f ); 
// (2)  (since C++17)  
     
      
  • 1)按顺序将给定的函数对象f应用于解引用范围[first, last)中的每个迭代器的结果。
  •   
  • 2)将给定的函数对象f应用于解引用范围[first, last)中的每个迭代器的结果(不一定按顺序)。该算法是根据策略执行的。除非std::is_execution_policy_v < std::decay_t < ExecutionPolicy > >为真,否则此重载不会参与重载解析。
  •   
     

对于两个重载,如果iterator typemutable,则f可以通过elements来修改range的{​​{1}}。如果dereferenced iterator返回结果,则忽略该结果。

     

与其余算法不同,f不允许按顺序制作for_each的副本,即使它们是elements


  

参数

     

第一最后-

     
      
  • 将功能应用于的范围
  •   
     

政策-

     
      
  • 要使用的执行策略。有关详细信息,请参见执行策略。
  •   
     

f -

     
      
  • 函数对象,应用于取消引用trivially copyable
  • 中的每个迭代器的结果   
  • 该函数的签名应等效于以下内容:
  •   
  • [first, last)
  •   
  • 签名不需要具有void fun(const Type &a);
  •   
  • 类型const &必须使得可以解除引用类型Type的对象,然后隐式转换为InputIt
  •   
     

类型要求

     

这将告诉您UnaryFunction2predicatefunction object满足functor'所需条件的所有要求的最后一个参数。如果您希望避免所有类或自定义数据结构都定义for_each,则可以编写一个通用函子来为您的类实现operator(),或者可以使用{ {1}}。您可以参考Remy Lebeau's答案以了解实施细节。