Результат, которого я пытаюсь достичь:
removeduplicates<TMPArray<8, 8, 9, 9, 10, 11, 11>>::type
приводит к тому же типу, что и TMPArray<8, 9, 10, 11>
Пока мое решение выглядит так:
template<int... I>
struct TMPArray {};
template <typename Arr1, typename Arr2>
struct concat;
template <int Ts, int... Us>
struct concat<TMPArray<Ts>, TMPArray<Us...>>
{
using type = TMPArray<Ts, Us...>;
};
template <int... Ts, int... Us>
struct concat<TMPArray<Ts...>, TMPArray<Us...>>
{
using type = TMPArray<Ts..., Us...>;
};
template<typename TMPArray>
struct removeduplicates;
template<bool isSame, typename TMPArray>
struct makeremoveduplicates;
template<int Head, int Sec, int... Tail>
struct removeduplicates<TMPArray<Head, Sec, Tail...>> {
using type = makeremoveduplicates<Head == Sec, TMPArray<Head, Sec, Tail...>>;
};
template<int Head, int Sec, int Third, int... Tail>
struct makeremoveduplicates<false, TMPArray<Head, Sec, Third, Tail...>> {
using type = concat<TMPArray<Head>,makeremoveduplicates<Sec == Third,TMPArray<Sec, Third, Tail... >>::type>::type;
};
template<int Head, int Sec, int Third, int... Tail>
struct makeremoveduplicates<true, TMPArray<Head, Sec, Third, Tail...>> {
using type = makeremoveduplicates<Sec == Third, TMPArray<Sec, Third, Tail... >>::type;
};
template<int Head, int Sec>
struct makeremoveduplicates<true, TMPArray<Head, Sec>> {
using type = TMPArray<Head>;
};
template<int Head, int Sec>
struct makeremoveduplicates<false, TMPArray<Head, Sec>> {
using type = TMPArray<Head, Sec>;
};
Идея этого решения заключается в том, что я использую помощник makeremoveduplicates для сравнения первых двух элементов и вызова специализированного шаблона, когда они совпадают или не совпадают. Это добавит результат рекурсивно с использованием метафункции concat.
Я обнаружил ошибку компиляции, в которой говорится, что:
Error C2923 'concat': 'makeremoveduplicates<Sec==Third,TMPArray<Sec,Third,Tail...>>::type' is not a valid template type argument for parameter 'Arr2'
Я ожидаю, что тип makeremoveduplicates будет оценивать TMPArray в соответствии с базовым случаем:
template<int Head, int Sec>
struct makeremoveduplicates<true/false, TMPArray<Head, Sec>>
и результат concat:
template <int Ts, int... Us>
struct concat<TMPArray<Ts>, TMPArray<Us...>>
{
using type = TMPArray<Ts, Us...>;
};
Почему это недопустимый тип?