【发布时间】:2020-09-29 23:35:39
【问题描述】:
向量any、all的标准C++17实现:
template<class C, class T>
bool contains(const C& c, const T& value) {
return std::find(c.begin(), c.end(), value) != c.end();
}
template<class C, class... T>
bool any(const C& c, T&&... value) {
return (... || contains(c, value));
}
template<class C, class... T>
bool all(const C& c, T&&... value) {
return (... && contains(c, value));
}
用于中的用法
std::array<int, 6> data0 = { 4, 6, 8, 10, 12, 14 };
assert( any(data0, 10, 55, 792));
assert( !any(data0, 11));
assert( all(data0, 6, 14, 8));
assert( !all(data0, 6, 7, 8));
是否有类似的方法来定义only,当且仅当向量的唯一值集与输入值匹配时才返回 true?所以以下断言将成立
std::array<int, 6> data1 = { 1, 1, 2, 1, 2 };
assert( only(data1, 1, 2));
assert( !only(data1, 1));
【问题讨论】:
-
传递给
only(参数包)的值是否保证具有唯一值? -
我们可以假设是的。
-
虽然在技术上可能是可行的,但我认为尝试将其作为折叠表达式来做是没有意义的。在 std 库函数中,您提供的要检查的值列表使用折叠表达式扩展为单个值,但如果您的目标是检查唯一性,则需要知道唯一列表的全部范围,因此扩展列表将违反直觉。
标签: c++ c++17 fold-expression