Any Solution to Unpack a Vector to Function Arguments in C++?

c++

Solution

You can use a pack of indices:

template <size_t num_args>
struct unpack_caller
{
private:
    template <typename FuncType, size_t... I>
    void call(FuncType &f, std::vector<int> &args, indices<I...>){
        f(args[I]...);
    }

public:
    template <typename FuncType>
    void operator () (FuncType &f, std::vector<int> &args){
        assert(args.size() == num_args); // just to be sure
        call(f, args, BuildIndices<num_args>{});
    }
};

There's no way to remove the need to specify the size in the template though, because the size of a vector is a runtime construct, and we need the size at compile-time.

Problem

I am actually thinking of something similar to the '*' operator in python like this: ``` args = [1,2,4] f(*args) ``` Is there a similar solution in C++? What I can come up with is as follows: ``` template <size_t num_args, typename FuncType> struct unpack_caller; template <typename FuncType> struct unpack_caller<3> { void operator () (FuncType &f, std::vector<int> &args){ f(args[0], args[1], args[3]) } }; ``` Above I assume only `int` argument type. The problem is that I feel it is a hassle to write all the specializations of unpack_caller for different value of `num_args`. Any good solution to this? Thanks.

Original source

Related problems