Как сравнить кортежи разной длины?

Я хотел бы написать компаратор, который сравнивает кортежи разной длины, но имеет одинаковый "префикс". Рассмотрим следующий случай, у меня есть два кортежа.

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


Я хотел бы применить "меньше" для t1

2 ответа

Решение

Ну, так как никто не вмешался, вот решение. Он использует 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";
}

t1 и t2 относятся к разным типам, поэтому вы не можете их сравнивать. (кортежи имеют тип шаблона; они не полиморфны во время выполнения). Я думаю, что единственный t-способ сделать это - временный кортеж, который берет t2 first и секунды, чтобы сделать сравнение

Другие вопросы по тегам