引數包上的cppreference 頁面指出有一個像這樣的引數包:
type ... pack-name(optional) (1)
但是你如何使用它?
這不起作用,錯誤是語法錯誤:
template<int... Ints>
int sum_2_int(Ints... args)
{
return (int)(args ...);
}
我無法從描述中弄清楚如何使用這個東西,也沒有在該頁面的任何地方看到使用示例。我可能只是跳過了它,因為我對 c 的這一部分非常缺乏經驗。
EDIT1:
我不想對任意數量的整數或任何型別求和。我寫了這個函式是因為我完全不了解如何以及在哪里使用這種型別的引數包,因為我認為它與型別 (2) 相似typename|class ... pack-name(optional)。
EDIT2:現在我知道嘗試Ints... args在函式定義中用作引數是徒勞的。我制作了一個新的片段,現在可以在這里使用。如果您知道更多此類引數包的使用示例,請分享。
uj5u.com熱心網友回復:
所以,我對型別 (1) 引數包的了解:
- 在函式定義中用作引數是不正確的,因為
template<int... Ints> int foo(...) {...}這意味著您以后應該將函式用作int i = foo<1,2,3,4,...>(...); - 它可以在擴展發生后用作某些函式的引數:
// parameter pack type [2] typename|class ... pack-name(optional)
template <typename... Types>
int sum_to_int(Types... args)
{
return (int)(args ...); // fold expression used here
}
// parameter pack [1] type ... pack-name(optional)
template <int... Ints>
int sum_ints_statically()
{
return sum_to_int(Ints...);
}
int main()
{
return sum_ints_statically<1,2,3,4,5>(); // will return 15!
}
感謝Evg和user17732522幫助我找到答案。
如果您了解更多,請添加更多使用示例!
uj5u.com熱心網友回復:
看起來您的函式旨在對整數串列求和。您可以直接為該串列提供非型別模板引數包且沒有普通引數,或者使用用于普通引數型別的型別模板引數包。不是兩者都屬于同一型別。例子:
template<int... Ints>
int sum_2_int()
{
return (int)(Ints ...);
}
sum_2_int<1, 2, 3>(); // template arguments must be known at compile time
template<typename... Ints>
int sum_2_int(Ints... args)
{
return (int)(args ...);
}
sum_2_int(1, 2, 3); // function arguments must be summable
演示
請注意,第二個版本接受每個引數的任何型別,但您可以使用std::enable_if或 C 20概念來約束它們。
回答您的編輯:上面的第一個版本正是您如何使用這樣的引數包。請注意,運算式是(Ints ...)而不是(args ...)。
您還可以查看std::integer_sequence,尤其是該頁面中的別名index_sequence和示例。
我還發現了這個在編譯時計算斐波那契數的特定應用程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531481.html
標籤:C 模板
