Constructor arguments from tuple

后端 未结 5 952
礼貌的吻别
礼貌的吻别 2020-12-01 19:41

Suppose I have a template which is parametrized by a class type and a number of argument types. a set of arguments matching these types are stored in a tuple. How can one pa

5条回答
  •  悲&欢浪女
    2020-12-01 20:11

    You need some template meta-programming machinery to achieve that.

    The easiest way to realize the argument dispatch is to exploit pack expansion on expressions which contain a packed compile-time sequence of integers. The template machinery is needed to build such a sequence (also see the remark at the end of this answer for more information on a proposal to standardize such a sequence).

    Supposing to have a class (template) index_range that encapsulates a compile-time range of integers [M, N) and a class (template) index_list that encapsulates a compile-time list of integers, this is how you would use them:

    template
    struct foo
    {
        tuple args;
    
        // Allows deducing an index list argument pack
        template
        T gen(index_list const&)
        {
            return T(get(args)...); // This is the core of the mechanism
        }
    
        T gen()
        {
            return gen(
                index_range<0, sizeof...(Args)>() // Builds an index list
                );
        }
    };
    

    And here is a possible implementation of index_range and index_list:

    //===============================================================================
    // META-FUNCTIONS FOR CREATING INDEX LISTS
    
    // The structure that encapsulates index lists
    template 
    struct index_list
    {
    };
    
    // Collects internal details for generating index ranges [MIN, MAX)
    namespace detail
    {
        // Declare primary template for index range builder
        template 
        struct range_builder;
    
        // Base step
        template 
        struct range_builder
        {
            typedef index_list type;
        };
    
        // Induction step
        template 
        struct range_builder : public range_builder
        {
        };
    }
    
    // Meta-function that returns a [MIN, MAX) index range
    template
    using index_range = typename detail::range_builder::type;
    

    Also notice, that an interesting proposal by Jonathan Wakely exists to standardize an int_seq class template, which is something very similar to what I called index_list here.

提交回复
热议问题