Encuentra el número de valores únicos de un paquete de parámetros

Dado un paquete de parámetros con argumentos variables, ¿cómo se puede encontrar el número de valores únicos en el paquete? Estoy buscando algo en la línea de

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

Mi implementación rudimentaria se ve algo así

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;
};

Aquí, me he especializado en hasta tres argumentos, pero es comprensible que el código crezca exponencialmente con el número de argumentos. Me gustaria tener unmeta solución para esto usando únicamenteSTL y no hay bibliotecas de terceros comoBoost.MPL.

Aquí puede encontrar una pregunta similar, aunque en el contexto de la verificación de tipos únicos, en lugar de encontrar el número de valores únicos del paquete de parámetros:

Verifique los parámetros de las plantillas variadas para la unicidad

En el proceso de encontrar el número de valores únicos de un paquete de parámetros, es posible que primero necesitemos ordenar el paquete, y en esta otra pregunta se proporciona una excelente implementación.

Ordenación rápida en tiempo de compilación utilizando plantillas variadas de C ++ 11

Respuestas a la pregunta(3)

Su respuesta a la pregunta