c++ - 容器的模板化元素比较函数
问题描述
我正在尝试为容器编写一个模板化的元素比较函数,如下所示:
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# - 打印指定范围的窗口窗体的一部分?
- java - 如何从列表中删除字符串并存储它?
- spring-boot - Spring Boot OAuth2RestTemplate 和 HTTP 客户端指标
- ios - 在 MacBook Pro 和 iMac 之间使用 Metal Performance Shaders 的结果不一致
- python - 如何在 int(input) 中将单词作为答案;
- python - 如何使用“for”循环进行多线程?
- python - 字典列表的聚合
- java - SpringBoot JUnit 和 @Value
- swift - 使用未声明的类型“PostTableViewCell”
- javascript - 如何打印出我保存在“联系人”数组中的每个对象