Search code examples
c++c++17fold-expressionparameter-pack

Expand parameter pack with index using a fold expression


I've got a template function taking a parameter pack. I want to expand it into calls to a second function while also supplying the index of the item in the pack. I probably can work out how to do it with recursion but I would like to try do it with a fold expression.

This is the function I want the parameter pack to expand into

template<typename T>
void addToRecord(Record& rec, int idx, T&& val)
{
    // Do some stuff.
}

And this is the function that takes the parameter pack

template<typename... ARGS>
void addRecord(ARGS&& ...values)
{
    Record rec;
    // addToRecord(rec, ??????)  How do expand 'values' here addToRecord with index of each item?
}

Is this possible? I realize this isn't critical but I'm also trying to get better with using fold expressions.


Solution

  • In addition to another answer let me mention a simpler approach that doesn't need a helper function:

    template<typename... Args>
    void addRecord(Args&&... values) {
        Record rec;
    
        int i = 0;
        (addToRecord(rec, i++, std::forward<Args>(values)), ...);
    }
    

    The comma operator , guarantees that all addToRecord()s will be called in order:

    In a comma expression E1, E2, the expression E1 is evaluated, its result is discarded, and its side effects are completed before evaluation of the expression E2 begins.