Найти количество уникальных значений пакета параметров

Учитывая пакет параметров с переменными аргументами, как можно найти количество уникальных значений в пакете. Я ищу что-то вроде

no_of_uniques<0,1,2,1,2,2>::value // should return 3

Моя элементарная реализация выглядит примерно так

template <size_t ... all>
struct no_of_uniques;
// this specialisation exceeds -ftemplate-depth as it has no terminating condition
template <size_t one, size_t ... all>
struct no_of_uniques<one,all...> {
    static const size_t value = no_of_uniques<one,all...>::value;
};
template <size_t one, size_t two, size_t three>
struct no_of_uniques<one,two,three> {
    static const size_t value = (one==two && one==three && two==three) ? 1:
                                (one!=two && two==three) ? 2:
                                (one==two && one!=three) ? 2:
                                (one==three && two!=three) ? 2: 3;
};
template <size_t one, size_t two>
struct no_of_uniques<one,two> {
    static const size_t value = one==two ? 1: 2;
};
template <size_t one>
struct no_of_uniques<one> {
    static const size_t value = 1;
};

Здесь я специализируюсь на трех аргументах, но по понятным причинам код растет экспоненциально с увеличением количества аргументов. Я хотел бы иметьmeta Решение для этого с использованием исключительноSTL и никаких сторонних библиотек, таких какBoost.MPL.

Подобный вопрос, хотя и в контексте проверки уникальных типов, а не определения количества уникальных значений пакета параметров, можно найти здесь:

Проверьте параметры шаблонов переменной на уникальность

В процессе нахождения количества уникальных значений пакета параметров нам может понадобиться сначала отсортировать пакет, и отличная реализация этого обеспечивается в этом другом вопросе.

Быстрая сортировка во время компиляции с использованием вариабельных шаблонов C ++ 11

Ответы на вопрос(3)

Ваш ответ на вопрос