Доброе времжя суток и здоровья в эти непростые дни
Пишу библиотеку , которая реализует функции математического редактора Wolfram Mathematica.
Например в редакторе есть функция Union со следующеий спецификацией
Union [list1,list2,...]
gives a sorted list of all the distinct elements that appear in any of the list i.
или
Union [list]
gives a sorted version of a list, in which all duplicated elements have been dropped.
Здесь привожу тест для ясности
Union[{a, b, a, c}, {d, a, e, b}, {c, a}]
{a, b, c, d, e}
Для реализации данноий функции определил следужющее :
template<typename T, typename... Ts >
T Union(const T& c1, const Ts&... rest)
{
..
}
template <typename T >
T Union(const T& c1, const T& c2 )
{
..
}
Пример вызова :
vector<char> list_1 = { 'a', 'b', 'a', 'c' };
vector<char> list_2 = { 'd', 'a', 'e', 'b' };
vector<char> list_3 = { 'c', 'a' };
auto res = Union( list_1, list_2, list_3);
Теперь хотелось бы добавить версию функции , которая получала бы еще предикат или ламбду для сравнения
например :
auto res = Union( list_1, list_2, list_3, cmp());
Но не могу понять как теперь определить сигнатуру функции Union , чтобы автоматически могла выводить тип предиката после переменного количества параметров
Что вроде такого
template<typename T, typename... Ts , typename Pred>
T Union(const T& c1, const Ts&... rest , Pred pred)
{
..
}
Таким образом чтобы цчтобы мозжно было вызывать :
auto res = Union( list_1, list_2, list_3); — с компаратором по умолчанию
и
auto res = Union( list_1, list_2, list_3, cmp());
Спасибо