Вывод типа шаблонного параметра функции
От: Alex34 Израиль  
Дата: 18.03.20 07:57
Оценка:
Доброе времжя суток и здоровья в эти непростые дни

Пишу библиотеку , которая реализует функции математического редактора 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());


Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.