2016-01-02 16 views
13

是的,我可以使用std::initializer_list。是的,更容易,我可以做聚合初始化。但這是如何工作的?我似乎無法繞過C++ 17的摺疊表達式。這裏沒有足夠的例子。使用摺疊表達式填充數組時出現語法問題

這就是我想出了:

template<class T, std::size_t N> 
struct foo 
{ 
    T arr[N]; 

    template<typename... Args> 
    constexpr foo(Args&&... pack) 
    { 
     static_assert(sizeof...(pack) <= N, "Too many args"); 
     std::size_t i = 0; 
     (arr[i++] = ...); 
    } 
}; 

int main() 
{ 
    foo<int, 5> a(1, 2, 3, 4, 5); 
} 

編輯:與最新鏘編譯。摺疊表達式被支持。

活生生的例子:http://coliru.stacked-crooked.com/a/777dc32da6c54892

+1

不應該至少是'(arr [i ++] = pack ...)'? –

+0

@VaughnCato Expression包含未展開的參數包'pack' - 所以Clang抱怨。 – DeiDei

+0

正如沃恩所說:「錯誤:包擴展不包含任何未展開的參數包」 – Deduplicator

回答

13

您需要用逗號操作,這也解決了排序問題摺疊。

(void(arr[i++] = pack) , ...); 
+2

是的,完美的作品。這個語法不會讓我感到困惑,需要一段時間。當別人寫它時,它看起來完全合乎邏輯。 :D – DeiDei

+0

並在coliru上http://coliru.stacked-crooked.com/a/f59078c078d25340 – Deduplicator

+1

@ Jarod42 Nope,','處理排序。 –

4

由於逗號運算符是左關聯的,你最好使用左目折:

(...,void(arr[i++] = pack)) 

演員陣容到void是確保內置逗號操作使用。在這種情況下,慣用性並不重要。

+2

沒關係。 '((a,b),c)'和'(a,(b,c))'評估'a',然後'b'和'c'。 –

+1

@ T.C .:有一個(虛空)演員,這是事實,但似乎最好習慣使用正確的旋律。 –

+0

@ T.C .:是的,功能風格演員更好。 –

相關問題