【发布时间】:2021-07-09 20:41:09
【问题描述】:
我有一组元组。 我正在整理它。 我可以选择在运行时使用哪个字段进行排序。
switch (columnIndex)
{
case 0:
std::ranges::sort(rows, [reversed](const rowType& a, const rowType& b) -> bool {
if (reversed)
{
return std::get<0>(a) < std::get<0>(b);
}
return std::get<0>(a) > std::get<0>(b);
});
break;
break;
case 2:
std::ranges::sort(rows, [reversed](const rowType& a, const rowType& b) -> bool {
if (reversed)
{
return std::get<2>(a) > std::get<2>(b);
}
return std::get<2>(a) < std::get<2>(b);
});
break;
case 3:
std::ranges::sort(rows, [reversed](const rowType& a, const rowType& b) -> bool {
if (reversed)
{
return std::get<3>(a) > std::get<3>(b);
}
return std::get<3>(a) < std::get<3>(b);
});
break;
}
(不要介意缺少案例 1)
我想用 c++20 模板 lambda 替换所有代码,所以我不必重复 lambda 3 次。 我制作了一个可以用于此目的的 lambda。
using rowType = std::tuple<size_t, const char*, unsigned int, unsigned int>;
bool reversed = false; // this is just an example of input I may have
auto sortLambda = [reversed]<size_t tupleIndex>(const rowType& a,
const rowType& b) -> bool {
if (reversed)
{
return std::get<tupleIndex>(a) < std::get<tupleIndex>(b);
}
return std::get<tupleIndex>(a) > std::get<tupleIndex>(b);
};
但我无法将其传递给排序。 我发现没有任何语法允许我指定模板参数来专门化 lambda,然后将其传递给排序。 我看不到任何使用具有模板参数的 lambda 的方法,以防函数参数中未使用该模板参数。
所以我需要使用 lambda 来捕获反转标志,用函数来做这件事很麻烦。 但我还需要模板参数来选择要比较的元组索引。 如何重写该代码以使用单个 lambda(或以任何其他方式摆脱重复)?
有什么方法可以真正调用我的模板 lambda?因为我找不到允许我为 lambda 手动指定模板参数的语法,但是如果我不手动指定它,它就无法自动推导出它。
(如果我使用 Visual C++ 2019 的编译器之间存在差异)
【问题讨论】:
-
你能发布可重现的例子吗?
-
我更新了代码,所以模板 lambda 现在应该可以编译了。至于其他代码,示例太大,可能没有必要。