Passing std::array as arguments of template variadic function

前端 未结 2 1123
旧时难觅i
旧时难觅i 2020-12-16 20:29

I am trying to learn about variadic templates in C++11. I have a class which is basically a wrapper around a std::array. I want to be able to pass function obje

2条回答
  •  爱一瞬间的悲伤
    2020-12-16 21:10

    Given the well-known indices infrastructure:

    namespace detail
    {
        template
        struct seq { };
    
        template
        struct gen_seq : gen_seq { };
    
        template
        struct gen_seq<0, Is...> : seq { };
    }
    

    You could redefine your class template this way:

    template
    struct Container {
        template
        Container(Ts&&... vs) : data{{std::forward(vs)...}} {
            static_assert(sizeof...(Ts)==N,"Not enough args supplied!");
        }
    
        template
        void doOperation(F&& func)
        {
            doOperation(std::forward(func), detail::gen_seq());
        }
    
        template
        void doOperation(F&& func, detail::seq)
        {
            (std::forward(func))(data[Is]...);
        }
    
        std::array data;
    };
    

    Here is a live example.

    Notice, that you do not need to construct an std::function object in main(): the std::function can be implicitly constructed from the lambda. However, you do not even need to use std::function at all here, possibly incurring in an unnecessary run-time overhead.

    In the solution above, I just let the type of the callable object to be a template parameter that can be deduced by the compiler.

提交回复
热议问题