【问题标题】:Variant with unique types具有独特类型的变体
【发布时间】:2020-05-30 20:10:23
【问题描述】:

在编写 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>

如何做到这一点?

【问题讨论】:

    标签: c++ c++17 variant


    【解决方案1】:
    #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;
    

    DEMO

    【讨论】:

      【解决方案2】:

      对于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>
      

      【讨论】:

      • 我喜欢它的简单性,但我会等待一些非增强的东西。我不想把这么大的依赖拉到小项目中
      • @bartop 这是一个独立的库。
      猜你喜欢
      • 2016-08-15
      • 2019-08-30
      • 2022-01-10
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2013-03-02
      • 2022-01-03
      相关资源
      最近更新 更多