C ++中的通用最小和最大Lambda函数

时间:2018-01-14 21:11:28

标签: c++ generics lambda tuples decltype

我正在尝试创建一个lambda函数lambdaMinMax,它将泛型数组的最小值和最大值作为元组返回。我正在尝试使用decltype,但我不确定我是否正确执行此操作:

 auto lambdaMinMax = [](const auto &v) {

    using vType = decltype(v[0]);

    vType min = numeric_limits<vType>::min();
    vType max = numeric_limits<vType>::max();

    auto iterBegin = v.begin();
    auto iterEnd = v.end();
    std::for_each(iterBegin, iterEnd, [&](const auto &a) mutable {
        min = [&]() -> auto { return a < min ? a : min; }();
        max = [&]() -> auto { return a > max ? a : max; }();
    });

    tuple<vType, vType> tupleRet(min, max);

    return tupleRet;
};

vector<double> vDouble;

for (double i = 0; i < 50; i++) {
    vDouble.push_back(i);
}      

auto tupMinMax = lambdaMinMax(vDouble);

cout << "Min: " << get<0>(tupMinMax) << " Max: " << get<1>(tupMinMax) << endl;

运行上面的代码时,我得到<function-style-cast>': cannot convert from 'initializer list' to 'vType '的错误。我相信这些错误来自两条numeric_limits行。我是关闭还是我需要采取不同的方法?

1 个答案:

答案 0 :(得分:2)

下面:

using vType = decltype(v[0]);

vType推断为const double&

numeric_limits类没有适当的专业化,因此您有错误。

您可以使用std::decay来编译代码(在这种情况下,它会删除引用和const限定符):

using vType = std::decay_t<decltype(v[0])>;

DEMO