在编写 cpp 库时,我最终发现std::variants 可能包含重复类型,例如std::variant<int, double, int, std::string, int>. 它在某些情况下可能很有用,但对于我的图书馆,我发现这是不必要的。所以我想像这样过滤类型重复:
std::variant<int, double, int, std::string, int>->std::variant<int, double, std::string>
std::variant<std::string, std::string, int>->std::variant<std::string, int>
如何才能做到这一点?
#include <type_traits>
#include <variant>
template <typename T, typename... Ts>
struct filter_duplicates { using type = T; };
template <template <typename...> class C, typename... Ts, typename U, typename... Us>
struct filter_duplicates<C<Ts...>, U, Us...>
: std::conditional_t<(std::is_same_v<U, Ts> || ...)
, filter_duplicates<C<Ts...>, Us...>
, filter_duplicates<C<Ts..., U>, Us...>> {};
template <typename T>
struct unique_variant;
template <typename... Ts>
struct unique_variant<std::variant<Ts...>> : filter_duplicates<std::variant<>, Ts...> {};
template <typename T>
using unique_variant_t = typename unique_variant<T>::type;
Run Code Online (Sandbox Code Playgroud)
对于Boost.Mp11,这是一个简短的单行代码(一如既往):
using V1 = mp_unique<std::variant<int, double, int, std::string, int>>;
// V1 is std::variant<int, double, std::string>
using V2 = mp_unique<std::variant<std::string, std::string, int>>;
// V2 is std::variant<std::string, int>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
631 次 |
| 最近记录: |