如何比较不同长度的元组?

时间:2016-02-22 20:30:40

标签: c++ c++11 tuples stdtuple

我想写一个比较器,它比较不同长度的元组但具有相同的"前缀"。考虑以下情况,我有两个元组。

auto t1 = std::make_tuple(10, "Test1");
auto t2 = std::make_tuple(10, "Test", 3.14);


我想申请" less"对于t1< t2,其中只比较了两个元组的第一个成员(相同的类型?)而第三个仅被省略。有可能吗?

2 个答案:

答案 0 :(得分:6)

好吧,既然没有人插话,这就是解决方案。它使用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";
}

答案 1 :(得分:-5)

t1和t2是完全不同的类型,因此您无法比较它们。 (元组是模板类型;它们在运行时不是多态的) 我认为这样做的唯一方法是使用t2 first和seconds元素进行比较的临时元组