是否有某种方法可以删除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>{});
}