Рассмотрим следующую программу:
#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
помощник должен переупорядочить типы в кортеже, так что два кортежа с типами sames, но упорядоченные по-разному приводят к одному типу кортежа: который может быть первым, вторым или даже другим: он просто должен имеют одинаковый размер и одни и те же элементы, но в уникальном порядке (независимо от этого порядка).
Можно ли это сделать во время компиляции с использованием методов метапрограммирования шаблонов?