C++相当于C#的Func <T,TResult>

ali*_*ray 9 c# c++ function-object c++11

下面的代码计算的特定属性的平均Titems收集:

public double Average<T>(IList<T> items, Func<T, double> selector)
{
    double average = 0.0;

    for (int i = 0; i < items.Count; i++)
    {
        average += selector(items[i])
    }

    return average / items.Count;
}
Run Code Online (Sandbox Code Playgroud)

然后我可以用一个lambda表达式来调用它:

double average = Average(items, p => p.PropertyName);
Run Code Online (Sandbox Code Playgroud)

我将如何在c ++中执行此操作?这是我到目前为止所拥有的:

template <typename T>
double average(const vector<T>& items, ?)
{
    double average= 0.0;

    for (int i = 0; i < items.size(); i++)
    {
        average += ?;
    }

    return average/ items.size();
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能用c ++调用它lambda


编辑:非常感谢你,这就是我最终的结果:

template <typename T>
double average(const vector<T>& items, function<double(T)> selector)
{
    double result = 0.0;

    for (auto i = items.begin(); i != items.end(); i++)
    {
        result += selector(*i);
    }

    return result / items.size();
}
Run Code Online (Sandbox Code Playgroud)

并在main():

zombie z1;
z1.hit_points = 10;

zombie z2;
z2.hit_points = 5;

items.push_back(z1);
items.push_back(z2);

double average = average<zombie>(items, [](const zombie& z) {       
    return z.hit_points;
});
Run Code Online (Sandbox Code Playgroud)

Pup*_*ppy 13

相同的事情是std::function<double(T)>.这是一个多态函数对象,它可以接受任何具有正确的函数对象operator(),包括lambda,手写函子,绑定成员函数和函数指针,强制执行正确的签名.

不要忘记在C#中,Func接口(或类,我忘了)写成Func<T, Result>,而C++ std::function写成result(T).

哦,另外,如果你没有C++ 0x,TR1中有一个,Boost中也有一个,所以你应该可以轻松访问它.