Здравствуйте, Alex34, Вы писали:
A>Таким образом чтобы цчтобы мозжно было вызывать :
A> auto res = Union( list_1, list_2, list_3); — с компаратором по умолчанию
A>и
A>auto res = Union( list_1, list_2, list_3, cmp());
Можно так как-то. Все проблемы решаются еще одним уровнем абстракции
#include <iostream>
#include <type_traits>
#include <vector>
#include<array>
template<typename... Ts>
struct select_last
{
template<typename T>
struct tag
{
using type = T;
};
using type = typename decltype((tag<Ts>{}, ...))::type;
};
struct MyPred {};
template<typename Pred>
struct is_predicate : std::false_type {};
template<>
struct is_predicate<MyPred> : std::true_type {};
template<typename T, typename... Ts>
std::enable_if_t<!is_predicate<typename select_last<Ts...>::type>::value, T>
union_helper(Ts... args)
{
//generic case with default predicate
std::cout << "generic case" << std::endl;
return T{};
}
template<typename T, typename... Ts>
std::enable_if_t<is_predicate<typename select_last<Ts...>::type>::value, T>
union_helper(Ts... args)
{
//case with last predicate
std::cout << "predicate case" << std::endl;
return T{};
}
template<typename T, typename... Ts>
T Union(const Ts&... args)
{
return union_helper<T>(args...);
};
int main()
{
MyPred p{};
Union<int>(std::vector<int>{}, std::array<int,10>{}, p);
Union<int>(std::vector<int>{}, std::array<int, 10>{}, std::array<int, 20>{});
}
https://godbolt.org/z/czTRV9