首页 > 解决方案 > 容器的模板化元素比较函数

问题描述

我正在尝试为容器编写一个模板化的元素比较函数,如下所示:

struct identity {
  template <typename U>
  constexpr auto operator()(U&& v) const noexcept
      -> decltype(std::forward<U>(v)) {
    return std::forward<U>(v);
  }
};

template <typename Comparator, typename Container>
constexpr auto elem_compare(const Container& a, const Container& b) noexcept {
  Container elemCompare{a};
  std::transform(a.cbegin(), a.cend(), b.cbegin(), elemCompare.begin(),
                 Comparator{});
  return std::all_of(elemCompare.cbegin(), elemCompare.cend(), identity{});
}

当尝试使用它时

  std::array a{-0.3, 0.1, -0.5};
  std::array b{0.0, 0.0, 0.0};
  auto isLessEqual = elem_compare<std::less_equal>(a, b);

我收到一个编译器错误,告诉我模板参数推导/替换失败。

我必须做什么才能使编译器elem_compare正确推断出模板参数?


编辑:这会是一个更好的实现吗?我该如何进一步改进它?

template <template <typename> typename Comparator, typename Container>
constexpr bool elem_compare(
    const Container& a,
    const Container& b,
    const Comparator<typename Container::value_type>& comparator =
        Comparator<typename Container::value_type>{}) noexcept {
  auto a_iterator = std::cbegin(a);
  auto b_iterator = std::cbegin(b);
  for (; a_iterator != a.cend() && b_iterator != b.cend();
       ++a_iterator, ++b_iterator) {
    if (!comparator(*a_iterator, *b_iterator))
      return false;
  }
  return true;
}

标签: c++c++17template-argument-deduction

解决方案


推荐阅读