Найти количество уникальных значений пакета параметров
Учитывая пакет параметров с переменными аргументами, как можно найти количество уникальных значений в пакете. Я ищу что-то вроде
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