我正在尝试创建一个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
行。我是关闭还是我需要采取不同的方法?
答案 0 :(得分:2)
下面:
using vType = decltype(v[0]);
vType
推断为const double&
。
numeric_limits类没有适当的专业化,因此您有错误。
您可以使用std::decay
来编译代码(在这种情况下,它会删除引用和const限定符):
using vType = std::decay_t<decltype(v[0])>;