如何编写一个以仿函数为参数的函数

aCu*_*ria 16 c++ visual-studio-2010

基本上我想这样做: 我可以使用lambda函数或std :: function对象代替函数指针吗?

显然,对于期望函数指针的函数来说,现在是不可能的.但是,它适用于需要仿函数的函数(我之前使用过stl的sort()函数)

但是,我不知道如何编写一个以仿函数为参数的函数!

任何人?

Pet*_*der 19

只需编写一个任意类型的函数:

template <typename Func>
void foo(Func fun)
{
    fun(...);
}
Run Code Online (Sandbox Code Playgroud)

然后,这将与函数指针,仿函数和lambda一起使用.

void f() {}

struct G
{
    void operator()() {}
};

foo(&f);           // function pointer
foo(G());          // functor
foo([]() { ... }); // lambda
Run Code Online (Sandbox Code Playgroud)


fre*_*low 17

我不知道如何编写一个以仿函数为参数的函数!

由于还没有人发布std::function解决方案:

#include <functional>
#include <iostream>

void foo(std::function<int(int)> f)
{
    for (int i = 0; i < 10; ++i)
    {
        std::cout << f(i) << ' ';
    }
    std::cout << '\n';
}

int main()
{
    foo( [](int x) { return x*x; } );
}
Run Code Online (Sandbox Code Playgroud)

您可以boost::function在pre C++ 11编译器中使用.

  • @Kerrek:为什么这是一件好事?这将导致无意义的类型擦除,即不必要的运行时性能损失。我认为只有在需要非本地持久性时才应使用“ std :: function &lt;&gt;”。 (2认同)
  • @ildjarn:也许吧。如果不知道实际的函数体和应用,就不可能争论利弊。您说得对,模板版本具有一定的优势,但了解非模板方法也很有好处。 (2认同)

Pla*_*aHH 6

它必须是一个模板,如:

template<class F>
void foo( const F& f )
{
    f(x,y);
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个技术上正确的响应,但它没有回答问题的精神 - 如果你特别想要_support_有状态的仿函数,为什么你会强迫仿函值作者在传递值的时候破解const正确性规则(作为标准库确实如此,这是一个相当先例IMO)会让她的工作变得无痛吗? (3认同)
  • 函数通常按值传递. (2认同)
  • @PlasmaHH:除了个人偏好之外,还有更多的东西,你的方式需要一个const`erator()`定义,而传递值则不然.例如,`std :: for_each`无法正常工作. (2认同)