C++ 如何编写以函子为参数的函数

C++ 如何编写以函子为参数的函数,c++,visual-studio-2010,C++,Visual Studio 2010,基本上我想这样做: 显然,对于期望函数指针的函数来说,这目前是不可能的。但是,它适用于需要一个函子的函数(我以前用stl的sort()函数做过) 然而,我不知道如何编写一个以函子为参数的函数 有人吗?它必须是一个模板,如: template<class F> void foo( const F& f ) { f(x,y); } 模板 空服费(固定餐饮费) { f(x,y); } 只需编写函数以获取任意类型: template <typename Func&g

基本上我想这样做:

显然,对于期望函数指针的函数来说,这目前是不可能的。但是,它适用于需要一个函子的函数(我以前用stl的sort()函数做过)

然而,我不知道如何编写一个以函子为参数的函数


有人吗?

它必须是一个模板,如:

template<class F>
void foo( const F& f )
{
    f(x,y);
}
模板
空服费(固定餐饮费)
{
f(x,y);
}

只需编写函数以获取任意类型:

template <typename Func>
void foo(Func fun)
{
    fun(...);
}
我不知道如何编写一个以函子为参数的函数

由于还没有人发布
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; } );
}
#包括
#包括
void foo(标准::函数f)
{
对于(int i=0;i<10;++i)
{

std::cout函子通常是按值传递的。@fredeOverlow:我想说这是个人偏好。我个人倾向于使用pass by const-ref.@plasmah:这不仅仅是个人偏好,关键是你的方式需要一个const
操作符()
定义,而按值传递则没有。
std::for_each
,例如,无法按您的方式工作。@PlasmaHH:但如果您要求其
运算符()保持状态,它们如何保持状态
be const?虽然这在技术上是正确的回答,但它并不能回答问题的实质——如果您特别想支持有状态函子,那么在传递值时,为什么要强迫函子作者绕过const正确性规则(就像标准库所做的那样,这在IMO中树立了一个先例)会让她的工作轻松吗?@Kerrek:为什么这是一件好事?这会导致无意义的类型擦除,即不必要的运行时性能损失。我认为只有在需要非本地持久性的情况下才应该使用
std::function
。@ildjarn:也许吧。不知道实际的函数b,就不可能争论利弊ody和应用程序。你说的对,模板化版本有一定的优势,但了解非模板方法也很好。@Kerrek:我可以同意。:-]“显然这是不可能的”-事实上,这是可能的。但是,只有无状态lambda可以转换为函数指针。这留下了问题。中提到的示例包括一个带有局部变量的函子。
add42
如果我将其作为
add42()传递,在计算时是否会准确地得到
42
而不是
add42
?这不是一个类型安全的解决方案,如果你想传入一个函数,请使用std::function,就像下面Fredwolf的回答一样。@sprite(该注释很旧,但是)注意
std::function
会产生运行时开销;此外,“不类型安全”是什么意思?如果无法调用提供的函数(但在实现中实际调用函数
fun(…)
而不是
foo(…)
行时),此函数将引发编译错误。
#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; } );
}