如何比较不同长度的元组?
How to compare tuples of different length?
我想写一个比较器来比较不同长度但具有相同 "prefix" 的元组。考虑以下情况,我有两个元组。
auto t1 = std::make_tuple(10, "Test1");
auto t2 = std::make_tuple(10, "Test", 3.14);
我想对 t1 < t2 应用 "less",其中仅比较元组的两个第一个成员(相同类型?),第三个被省略。可能吗?
t1和t2是完全不同的类型,不能比较。 (元组是模板类型;它们在运行时不是多态的)
我认为唯一的 t-way 是一个临时元组,它需要 t2 第一和第二个元素来进行比较
好吧,既然没有人插话,那就是解决方案。它使用 C++14 std::index_sequence
,因此递归隐藏在其中。
#include <tuple>
#include <utility>
template<class... ARGS1, class... ARGS2, std::size_t... Is>
bool tuple_compare_helper(const std::tuple<ARGS1...>& lhs, const std::tuple<ARGS2...>& rhs, std::index_sequence<Is...> ) {
return std::tie(std::get<Is>(lhs)...) < std::tie(std::get<Is>(rhs)...);
}
template<class... ARGS1, class... ARGS2>
bool tuple_compare(const std::tuple<ARGS1...>& lhs, const std::tuple<ARGS2...>& rhs) {
const auto min_size = std::min(sizeof...(ARGS1), sizeof...(ARGS2));
return tuple_compare_helper(lhs, rhs, std::make_index_sequence<min_size>());
}
// test driver
#include <iostream>
int main() {
auto t1 = std::make_tuple(1, std::string("One"), 2.0);
auto t2 = std::make_tuple(3, std::string("Two"));
std::cout << tuple_compare(t2, t1) << "\n";
}
我想写一个比较器来比较不同长度但具有相同 "prefix" 的元组。考虑以下情况,我有两个元组。
auto t1 = std::make_tuple(10, "Test1");
auto t2 = std::make_tuple(10, "Test", 3.14);
我想对 t1 < t2 应用 "less",其中仅比较元组的两个第一个成员(相同类型?),第三个被省略。可能吗?
t1和t2是完全不同的类型,不能比较。 (元组是模板类型;它们在运行时不是多态的) 我认为唯一的 t-way 是一个临时元组,它需要 t2 第一和第二个元素来进行比较
好吧,既然没有人插话,那就是解决方案。它使用 C++14 std::index_sequence
,因此递归隐藏在其中。
#include <tuple>
#include <utility>
template<class... ARGS1, class... ARGS2, std::size_t... Is>
bool tuple_compare_helper(const std::tuple<ARGS1...>& lhs, const std::tuple<ARGS2...>& rhs, std::index_sequence<Is...> ) {
return std::tie(std::get<Is>(lhs)...) < std::tie(std::get<Is>(rhs)...);
}
template<class... ARGS1, class... ARGS2>
bool tuple_compare(const std::tuple<ARGS1...>& lhs, const std::tuple<ARGS2...>& rhs) {
const auto min_size = std::min(sizeof...(ARGS1), sizeof...(ARGS2));
return tuple_compare_helper(lhs, rhs, std::make_index_sequence<min_size>());
}
// test driver
#include <iostream>
int main() {
auto t1 = std::make_tuple(1, std::string("One"), 2.0);
auto t2 = std::make_tuple(3, std::string("Two"));
std::cout << tuple_compare(t2, t1) << "\n";
}