私はいくつかのアプローチを思いついた、
まず、カスタム関数で、
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);
}
それらは基本的に同じことを行います。1 つは再帰的に、もう 1 つは反復的に行います。
jrokの答えに加えて、これもうまくいきますが、ラムダはありません。
std::any_of(predicates.begin(), predicates.end(), std::bind(std::equal_to<std::string>(), "dance", std::placeholders::_1));
を使用std::bind
することで、追加のラムダの使用を避けることができます。
最後の例では、一定の述語がいくつかあることを前提としています。
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