Home >Backend Development >C++ >How to Correctly Loop Over a Parameter Pack in Variadic Templates?
How to Loop Over a Parameter Pack Using a Pack Expansion
When using variadic templates and functions, it's essential to understand the use of pack expansions. Consider the following code:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); }
Upon compilation, this code fails with the error:
Error C3520: 'args': parameter pack must be expanded in this context
The Solution: Pack Expansion in Braced-Init-List
To address this issue, you can use a pack expansion within a braced-init-list:
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Understanding the Braced-Init-List
The initializer list inside the array definition expands the pack expansion into a comma-separated list. The cast to void ensures that the comma operator used is the built-in one rather than any overloaded versions. This guarantees left-to-right evaluation of the pack expansion.
Additional Options with C 17
In C 17, you can simplify the code using fold expressions:
((void) bar(std::forward<Args>(args)), ...);
Conclusion
By utilizing a pack expansion within a braced-init-list or a fold expression in C 17, you can effectively loop over a parameter pack and avoid compilation errors. Understanding this technique is crucial for working with variadic templates and functions in C .
The above is the detailed content of How to Correctly Loop Over a Parameter Pack in Variadic Templates?. For more information, please follow other related articles on the PHP Chinese website!