的考慮下面的輔助功能理由模板參數包擴展語法
template <typename ... Ts>
auto f(Ts&& ... args) {}
template <typename T>
auto g(T x) { return x; }
1)我們展開一個模板參數包如常。
template <typename ... Ts>
void test1(Ts&& ... args)
{
f(args...);
}
2)這裏膨脹...
的g()
函數調用後發生。這也是合理的,因爲g()
被稱爲與每個args
:
template <typename ... Ts>
void test2(Ts&& ... args)
{
f(g(args)...);
}
3)用同樣的邏輯我希望test3(Is, args...)...
,但沒有。你必須寫test3(Is..., args...)
:
template <typename ... Ts>
void test3(size_t i, Ts&& ... args)
{
f(args...);
}
template <typename ... Ts>
void test3(std::index_sequence<Is...>, Ts&& ... args)
{
// would expect test3(Is, args...)...;
test3(Is..., args...);
}
我知道,我使用它,但好了,我不明白這一點。模板擴展的整個概念是表達式摺疊的一種形式。不是用C++ 17的方式,而是從...
之前的子表達式被摺疊(或者如果你喜歡的話重複)關於可變參數。在test3
的情況下,我們相對於Is
「摺疊」表達式test3(Is, args...)
。然而,我們必須編寫test3(Is..., args...)
而不是test3(Is, args...)...
。
有了這個奇怪的標準邏輯,你也可以寫f(g(args...))
而不是f(g(args)...)
- 但是這是無效的。看起來語言在不同的上下文中使用不同的邏輯。
不同語法背後的基本原理是什麼?
無法使用參數包擴展,而無需使用[技巧](http://stackoverflow.com/鏈通話a/17340003/1794345) – Rerito
@Rerito謝謝,但我知道這一招。不幸的是,這並沒有回答這個問題。 – plasmacel