簡體   English   中英

如何將可變參數列表傳遞給接受可變參數的函數?

[英]How to pass in variadic list of parameters to a function that takes in variable parameters?

我有一個模板參數包,我想將它傳遞給一個接受可變數量參數的函數。 由於我不知道我實際有多少個參數,如何將未知數量的參數數據成員傳入函數?

template <typename BarType...>
Class Test
{
   explicit Test(BarType ...bars)
   {
   // Calling this function with parameter pack instead of this way 
   // (which won't even work with above parameter pack)
   FooFunction(
   [](BarType &bar1){ return bar1.bar_member; },
   [](BarType &bar2){ return bar2.bar_member; },
   [](BarType &bar3){ return bar3.bar_member; })
   }

}

如何在不手動列出所有三個參數(使其更具動態性)的情況下完成上述FooFunction 由於可能有更多參數bar4bar5等。因此僅手動列出它們是行不通的。

看起來你可能想要:

template <typename BarType...>
Class Test
{
   explicit Test(BarType ...bars)
   {
       FooFunction(bars.bar_member ...);
   }
};

使用參數包的最常見方法是擴展它,通過在列表的每個元素中放置一個表示應該是什么,然后是省略號標記...

因此,如果我們采用專業化Test<B1, B2, B3> ,它有一個像explicit Test(B1 b1, B2 b2, B3 b3);這樣的構造函數explicit Test(B1 b1, B2 b2, B3 b3); 除了名稱b1b2b3只是為了解釋而組成的。 在該函數體中,一些可能涉及包擴展的事情以及它們將實例化為:

std::make_tuple(bars...) -> std::make_tuple(b1, b2, b3)
std::tuple<BarType...>   -> std::tuple<B1, B2, B3>
f(g(bars) ...)           -> f(g(b1), g(b2), g(b3))
h<BarType>(bars)...      -> h<B1>(b1), h<B2>(b2), h<B3>(b3)

最后一個將模板參數包BarType和函數參數包bars擴展到一起,匹配相應的包元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM