, Это было бы хорошим дополнением к Hana, чтобы сделать их заказчиками, потенциальная ловушка в том, что порядок может в конечном итоге зависеть от платформы / компилятора.
отрим следующую программу:
#include <tuple>
#include <vector>
#include <iostream>
#include <type_traits>
template <class T>
struct ordered {};
template <class... T>
struct ordered<std::tuple<T...>>
{
using type = /* a reordered tuple */;
};
template <class T>
using ordered_t = typename ordered<T>::type;
int main(int argc, char* argv[])
{
using type1 = std::tuple<char, std::vector<int>, double>;
using type2 = std::tuple<std::vector<int>, double, char>;
std::cout << std::is_same_v<type1, type2> << "\n"; // 0
std::cout << std::is_same_v<ordered_t<type1>, ordered_t<type2>> << "\n"; // 1
return 0;
}
ordered
Помощник должен переупорядочить типы в кортеже, так что два кортежа с одинаковыми типами, но упорядоченными по-разному, приводят к одному и тому же типу кортежа: это может быть первый, второй или даже другой: он просто должен иметь тот же размер и те же элементы, но в уникальном порядке (независимо от этого порядка).
Можно ли сделать это во время компиляции, используя методы метапрограммирования шаблонов?