Re: Вывод типа шаблонного параметра функции
От: andyp  
Дата: 18.03.20 09:40
Оценка: 13 (3)
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.