如何删除类型列表中的重复类型

时间:2019-06-23 17:08:44

标签: c++ templates

是否有某种方法可以删除std::tuple中的重复类型?

我尝试添加另一个tuple<> bench并在解包类型参数期间对其进行扩展。但这不起作用。

template<typename... Typelists>
struct type_list {
    using types = std::tuple<Typelists...>;
};
template<typename U, typename... T>
constexpr auto contains(std::tuple<T...>) {
    return not std::is_same<
        std::integer_sequence<bool, false, std::is_same<U, T>::value...>,
        std::integer_sequence<bool, std::is_same<U, T>::value..., false>
    >::value;
}
template<typename... Typelists>
struct type_list {
    using types = std::tuple<Typelists...>;
};
template<template<class...> class Type1, typename... Typelists1,
         template<class...> class Type2, typename... Typelists2>
auto remove_dupliate(Type1<Typelists1...> curTuple, 
                     Type2<Typelists2...> bench){
    return std::apply([&](auto first, auto... rest) mutable {
        auto filtered_rest = [&]() mutable {
            if constexpr (sizeof...(rest)) {
                return remove_dupliate(std::tuple{rest...}, std::tuple_cat(bench, std::tuple{rest...}));
            } else {
                return std::tuple{};
            }
        }();

        if constexpr (contains<decltype(first)>(bench)) {
            return filtered_rest;
        } else {
            return std::tuple_cat(std::tuple{first}, filtered_rest);
        }
    }, curTuple);
}

int main() {
    using type_collection = type_list<int, double, std::string, int>::types;    
    auto new_tuple = remove_dupliate(type_collection{}, tuple<> bench{});
    COMPILE_TYPE_ASSERT_EQUAL(new_tuple, tuple<int, double, std::string>{});
}

0 个答案:

没有答案