迭代打包的可變參數範本參數清單
簡介
可變參數範本可讓您建立可以使用參數範本數量可變。然而,迭代這些論點可能具有挑戰性。本文探討了迭代打包可變參數模板參數清單的方法,包括使用折疊表達式的綜合解決方案。
方法 1:迭代同質類型輸入
如果您的輸入都是相同的類型,您可以使用宏或 lambda 函數來循環它們。例如:
1 2 3 | <code class = "cpp" ># include <iostream>
#define FOREACH_INPUT(...) (([](auto &&... inputs) { for (auto input : { __VA_ARGS__ }) { std::cout << input << std::endl; } })(inputs))</code>
|
登入後複製
用法:
1 | <code class = "cpp" >FOREACH_INPUT(1, 2, 3, 4, 5);</code>
|
登入後複製
方法2:折疊表達式(>= C 17)
對於混合-類型輸入,折疊表達式提供了一種簡潔而強大的方法。請考慮以下範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <code class = "cpp" ># include <iostream>
# include <utility>
template < class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
([&]
{
std::cout << "input " << ++i << " = " << inputs << std::endl;
} (), ...);
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a' , 2.3);
}</code>
|
登入後複製
具有中斷/返回的增強折疊表達式
如果您的循環中需要中斷或返回,請考慮以下解決方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <code class = "cpp" ># include <iostream>
# include <utility>
template < class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
try {
([&]
{
std::cout << "input " << ++i << " = " << inputs << std::endl;
if (inputs == 'a' ) throw 1;
} (), ...);
} catch (...) {
}
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a' , 2.3);
}</code>
|
登入後複製
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <code class = "cpp" ># include <iostream>
# include <utility>
template < class ... Ts>
void Foo (Ts &&... inputs)
{
int i = 0;
bool exit = false;
auto process_input = [&](auto &&input) mutable {
if (input == 'a' ) {
std::cout << "Found 'a'. Breaking loop." << std::endl;
exit = true;
return ;
}
std::cout << "input " << ++i << " = " << input << std::endl;
};
(process_input(inputs), ...);
if (! exit )
std::cout << "Finished looping through all inputs." << std::endl;
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a' , 2.3);
}</code>
|
登入後複製
以上是如何在 C 中有效地迭代打包的可變參數模板參數列表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!