将 std::function 作为参数传递给 for_each

Posted

技术标签:

【中文标题】将 std::function 作为参数传递给 for_each【英文标题】:passing std::function as a parameter to for_each 【发布时间】:2015-12-10 17:21:50 【问题描述】:
#include <initializer_list>
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>

std::function<void(int)> sample_function()

    return
        [](int x) -> void
    
        if (x > 5)
            std::cout << x;
    ;


int main()

    std::vector<int> numbers 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 ;
    std::for_each(numbers.begin(), numbers.end(), sample_function);
   

我正在尝试将 sample_function() 传递给 for_each,但我遇到了这个错误

错误 C2197 'std::function': 调用参数过多

【问题讨论】:

此代码不会将std::function 传递给for_each。它传递sample_function,这是一个不带参数并返回std::function&lt;void(int)&gt; 类型的对象的函数。错误信息是正确的:sample_function 不带参数,因此不能使用范围内的元素调用。 【参考方案1】:

我认为您想要的是以下内容

#include <iostream>
#include <vector>
#include <functional>

std::function<void(int)> sample_function =  [](int x)

    if (x > 5)  std::cout << x << ' ';
;


int main()

    std::vector<int> numbers 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 ;
    std::for_each(numbers.begin(), numbers.end(), sample_function);

输出是

10 15 20 25 35 45 50

或者,如果您确实想定义一个返回 std::function 类型对象的函数,那么您可以编写

#include <iostream>
#include <vector>
#include <functional>

std::function<void(int)> sample_function()

    return  [](int x)
            
                if (x > 5)  std::cout << x << ' ';
            ;



int main()

    std::vector<int> numbers 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 ;
    std::for_each(numbers.begin(), numbers.end(), sample_function() );

输出将与上图相同。注意通话

    std::for_each(numbers.begin(), numbers.end(), sample_function() );
                                                                ^^^^

【讨论】:

【参考方案2】:

您需要括号来调用对sample_function 的函数调用,然后它将为您的for_each 返回std::function 对象:

std::function<void(int)> sample_function() 
  return [](int x) -> void 
     if (x > 5) std::cout << x;
  ;


int main() 
    std::vector<int> numbers 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 ;
    std::for_each(numbers.begin(), numbers.end(), sample_function());
                                                                 ^^
 

Live Demo

【讨论】:

以上是关于将 std::function 作为参数传递给 for_each的主要内容,如果未能解决你的问题,请参考以下文章

如何将 std::function 对象传递给采用函数指针的函数?

将字典作为关键字参数传递给函数

如何将多个参数传递给 Process?

将 lambda 作为参数传递 - 通过引用或值?

Scipy 最小化:如何将参数传递给目标和约束

将额外参数传递给 f:ajax onevent 函数