【发布时间】:2017-11-03 13:30:14
【问题描述】:
所以我很好奇c++17 是否让我能够灵活地执行此操作。我有this answer,其中包含代码:
template <typename T>
function<void(vector<pair<T, T>>&)> vertex_triangle(const size_t index, const vector<pair<T, T>>& polygon) {
if (0U == index){
return [&](vector<pair<T, T>>& output){ output.push_back(polygon.back());
output.push_back(polygon.front());
output.push_back(polygon[1U]); };
}else if (index == (polygon.size() - 1U)){
return [&](vector<pair<T, T>>& output){ output.push_back(polygon[polygon.size() - 2U]);
output.push_back(polygon.back());
output.push_back(polygon.front()); };
}else{
return [&](vector<pair<T, T>>& output){ output.push_back(polygon[index - 1U]);
output.push_back(polygon[index]);
output.push_back(polygon[index + 1U]); };
}
}
我认为我应该能够将函数签名更改为:auto vertex_triangle(const size_t index, const vector<pair<T, T>>& polygon),从而保留闭包类型优化。此外,我真的很想让我的 lambda 参数为 auto& 而不是 vector<pair<T, T>>&。
c++17 会支持这些更改吗?
【问题讨论】:
-
lambda 有不同的类型,因此
auto将无法推断出返回类型。如果index是constexpr您可以使用if constexpr并在编译时做出决定。 -
对于
auto vertex_triangle(const size_t index, const vector<pair<T, T>>& polygon),您想为auto推导出什么?每个 lambda 都有不同的类型,并且由于它们捕获,它们也没有共同的类型。
标签: c++17 c++17 c++ lambda closures c++17 auto