How do I find out if a tuple contains a type?

后端 未结 7 1790
时光说笑
时光说笑 2020-11-30 08:50

Suppose I want to create a compile-time heterogenous container of unique types from some sequence of non-unique types. In order to do this I need to iterate over th

7条回答
  •  暖寄归人
    2020-11-30 09:12

    Here is a version that does not recursively instantiate the template to check for a matching type. Instead it uses SFINAE with indices-based meta-programming:

    #include 
    #include 
    
    template 
    struct index_sequence {
        typedef index_sequence next;
    };
    
    template 
    struct make_index_sequence {
        typedef typename make_index_sequence::type::next type;
    };
    
    template <>
    struct make_index_sequence<0> {
        typedef index_sequence<> type;
    };
    
    template 
    using make_index_sequence_t = typename make_index_sequence::type;
    
    template 
    struct lookup;
    
    template 
    struct lookup>
    {
    private:
        struct null;
    
        template 
        static std::false_type
        apply(std::conditional_t::value, null, Args>...);
    
        template 
        static std::true_type apply(...);
    
        template 
        static auto apply_helper(Args&&...) ->
        decltype(apply...>(std::declval()...));
    public:
        template 
        using value = decltype(
            apply_helper(
                std::declval<
                    typename std::tuple_element::type
                >()...
            )
        );
    };
    
    template 
    using has_type = decltype(
        typename lookup::value>
        >::template value{}
    );
    

    Live Demo

提交回复
热议问题