【问题标题】:Generic Min and Max Lambda Function in C++C++ 中的通用最小和最大 Lambda 函数
【发布时间】:2018-01-14 21:11:27
【问题描述】:

我正在尝试创建一个 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;

运行上述代码时,我收到&lt;function-style-cast&gt;': cannot convert from 'initializer list' to 'vType ' 的错误。我相信这个错误来自两个numeric_limits 行。我是接近还是需要采取不同的方法?

【问题讨论】:

  • 不要编辑您的问题以包含答案。它使阅读帖子变得混乱,并且经常使答案无效。注意到答案解决了您的问题的适当方法是将其标记为已接受,您已经这样做了

标签: c++ generics lambda tuples decltype


【解决方案1】:

这里:

using vType = decltype(v[0]);

vType 推导出为const double&amp;

numeric_limits 类没有合适的特化,所以你有一个错误。

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

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

DEMO

【讨论】:

  • 是的,这行得通。我确实意识到我对lambdaMinMax 的整体设计是错误的,使用numeric_limit 获取向量的最小值和最大值没有意义,但decay_t 帮助我解决了我提出的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
相关资源
最近更新 更多