C++ C++;测试向量组成的17倍语法

C++ C++;测试向量组成的17倍语法,c++,c++17,fold-expression,C++,C++17,Fold Expression,标准C++17矢量any,all的实现: 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)

标准C++17矢量
any
all
的实现:

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));
}

它不使用折叠表达式,但应该可以工作

template<class C, class... T>
bool only(const C& c, T&& ...vals) {
    auto ilist = {vals...}; //create initializer_list

    for (auto el : c) {
        if (!contains(ilist, el)) return false;
    }
    return true;
}
鲍勃是你叔叔


我们还可以执行基于
notcontains
算法,但我认为这更复杂。

您可以提供
计数
功能:

template<class C, class T>
auto count(const C& c, const T& value) {
  return std::count(c.begin(), c.end(), value);
}
这会处理
c
中的重复元素,但要求
s是唯一的


这里有一个问题。

传递给
的值是否只有
(参数包)保证有唯一的值?我们可以假设是的。虽然在技术上可能是可行的,但我认为尝试将其作为折叠表达式来做是没有意义的。在您提供的std库函数中,要检查的值列表通过折叠表达式展开为单个值,但如果您的目标是检查唯一性,则需要了解唯一列表的完整范围,因此展开列表将违反直觉。
template<class C, class... T>
bool only(const C& c, T&& ...vals) {
    auto ilist = {vals...}; //create initializer_list

    for (auto el : c) {
        if (!contains(ilist, el)) return false;
    }
    return true;
}
template<class T, class... Ts>
bool is_one_of(const T& val, Ts&& ...vals)
{
    return ((val == vals) || ...);
}

template<class C, class... Ts>
bool only(const C& c, Ts&& ...vals)
{
    for (const auto& el : c) {
        if (!is_one_of(el, vals...)) return false;
    }
    return true;
}

// or if you hate raw loops
template<class C, class... Ts>
bool only(const C& c, Ts&& ...vals)
{
    using std::beign; using std::end;
    auto it = std::find_if(begin(c), end(c), [&](const auto& el) {
        return !is_one_of(el, vals...);
    });
    return (it == end(c));
}
template<class C, class...Ts>
bool only( C const& c, Ts&&...ts ) {
  std::size_t count = (std::size_t(0) + ... + contains(c, ts));
  return count == c.size();
}
template<class C, class...Ts>
bool only( C const& c, Ts&&...ts ) {
  using std::begin; using std::end;
  auto count = std::count_if( begin(c), end(c), [&](auto&& elem) {
    return ((elem == ts) || ...);
  } );
  return count == c.size();
}
template<class C, class T>
auto count(const C& c, const T& value) {
  return std::count(c.begin(), c.end(), value);
}
template<class C, class... T>
bool only(const C& c, T&&... value) {
  return (count(c, value) + ...) == c.size();
}