Parameter packs not expanded with '…'

后端 未结 3 801
耶瑟儿~
耶瑟儿~ 2020-12-29 08:34

I have this code:

#include 
using namespace std;

int print(int i)
{
    cout << endl << i;
}

template
i         


        
相关标签:
3条回答
  • 2020-12-29 09:14

    Pack expansions can only happen in pack expansion contexts. These essentially are :

    • braced initialization
    • initializer lists
    • aggregate initializations
    • function calls
    • array initializations

    Of these the easier to use in your case would be the last :

    #include <iostream>
    using namespace std;
    int print(int i)
    {
        cout<<endl<<i;
        return 0;
    }
    
    template<typename ...args>
    inline void expand(args&&... a)
    {
        using expander = int[]; 
        (void)expander{0, ((void)print(a), 0)...}; 
    }
    
    int main() 
    {
        expand(1,2,3,4);
    
        return 0;
    }
    

    Demo

    0 讨论(0)
  • 2020-12-29 09:17

    Essentially, expanding a parameter pack E... produces a list E1, E2, [...], EN, one E for each element in the pack. This syntactic construct is only valid in places where lists are grammatically correct, such as in function calls, initializer lists etc. An expression containing multiple comma operators does not count.

    I believe that with fold expressions (N4295: Folding expressions (Andrew Sutton, Richard Smith)) you'll be able to simply write:

    (print(a), ...);
    

    In this expression,

    • print(a) is an expression with an unexpanded parameter pack,
    • , is the operator and
    • ... designates the right fold expansion.

    The result of the entire expression is that (print(a), ...) will be transformed into

    print(a1) , (print(a2), (print(a3), print(a4))) // (assuming four elements). 
    
    0 讨论(0)
  • 2020-12-29 09:27

    This one works too:

    #include <iostream>
    
    void print() {}
    
    template<typename T, typename ... Types>
    void print (T firstArg, Types ... args) {
        std::cout << firstArg << "\n";
        print(args...);
    }
    
    int main() {
        print("Hello",1337,42.44,"World");
    }
    

    Demo

    0 讨论(0)
提交回复
热议问题