我想出了几种方法,
首先,使用自定义函数,
template<typename ValueType, typename ForwardIterator>
bool is_in(ValueType value, ForwardIterator begin, ForwardIterator end) {
while (begin != end) {
if (value == *(begin ++)) {
return true;
}
}
return false;
}
template<typename ValueType, typename ForwardIterator>
bool is_in(ValueType value, ForwardIterator begin, ForwardIterator end) {
if (begin == end) return false;
return value == *(begin ++) || is_in(value, begin, end);
}
它们基本上做同样的事情,一个是递归的,另一个是迭代的。
添加到 jrok 的答案中,这也可以解决问题,但没有 lambda。
std::any_of(predicates.begin(), predicates.end(), std::bind(std::equal_to<std::string>(), "dance", std::placeholders::_1));
通过使用std::bind
,我们可以避免使用额外的 lambda。
最后一个假设你只有几个常量谓词,
template<typename Comparable>
bool is_any(Comparable value) {
return false;
}
template<typename ValueType, typename Comparable, typename... Comparables>
bool is_any(ValueType value, Comparable predicate, Comparables... predicates) {
return value == predicate || is_any(value, predicates...);
}
你可以像这样使用它,
is_any("dance", "apple", "banana", "cat"); // false