Search code examples
c++templatesparameter-pack

Can multiple parameter packs be expanded in a single expression?


I want to get a matrix from two parameter packs like the following:


template < typename T1, typename T2 > struct Multi{};
template < int ... n > struct N{};

void Print( int n ){ std::cout << n << std::endl; }

template < int ... n1, int ... n2 >
struct Multi< N<n1...>, N<n2...>> 
{
    Multi() 
    {   
        using expander = int[];

        // No idea which syntax should be used here:
        expander{ 0,((void)Print(n1...*n2),0)... };
    }
};


int main()
{
    Multi< N<1,2,3,4>, N< 10,20> >{};
}

The result should be

10 20 30 40 20 40 60 80

How can I do this?


Solution

  • No need to use the dummy arrays when you have fold expressions.

    The naive (Print(n1 * n2), ...); wouldn't work (it expects the packs to have the same size, and would print N numbers instead of N2).

    You need two nested fold expressions. In the inner one, you can prevent one of the packs from being expanded by passing it as a lambda parameter.

    ([](int n){(Print(n1 * n), ...);}(n2), ...);