2016-01-02 19 views
13

Có, tôi có thể sử dụng std::initializer_list. Có, thậm chí dễ dàng hơn, tôi có thể khởi tạo tổng hợp. Nhưng nó hoạt động như thế nào? Tôi dường như không thể gấp đầu của tôi xung quanh biểu thức gấp nếp của C++ 17. Không có đủ ví dụ ngoài kia.Vấn đề cú pháp khi điền một mảng có biểu thức gấp

Đây là những gì tôi đã đưa ra:

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); 
} 

EDIT: Biên soạn với mới nhất Clang. Biểu thức gấp được hỗ trợ.

Sống dụ:http://coliru.stacked-crooked.com/a/777dc32da6c54892

+1

Không nên ít nhất là '(arr [i ++] = pack ...)'? –

+0

@VaughnCato Expression chứa gói thông số chưa được mở rộng 'gói' - vì vậy Clang phàn nàn. – DeiDei

+0

Như Vaughn đã nói: "lỗi: mở rộng gói không chứa bất kỳ gói tham số chưa được mở rộng" – Deduplicator

Trả lời

13

Bạn cần phải gấp với toán tử dấu phẩy, mà còn giải quyết vấn đề trình tự.

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

Vâng, hoạt động hoàn hảo. Nó sẽ mất một thời gian trước khi cú pháp này trở nên không gây nhầm lẫn cho tôi. Nó trông hoàn toàn hợp lý khi ai đó viết nó. : D – DeiDei

+0

Và trên coliru http://coliru.stacked-crooked.com/a/f59078c078d25340 – Deduplicator

+1

@ Jarod42 Không, ',' xử lý trình tự. –

4

Kể từ khi các nhà điều hành dấu phẩy được trái kết hợp, bạn sẽ lý tưởng sử dụng một lần unary trái:

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

Dàn diễn viên để void là để đảm bảo rằng các built-in dấu phẩy điều hành được sử dụng. Trong trường hợp này, sự thuận tay không thực sự quan trọng.

+2

Không quan trọng. Cả hai '((a, b), c)' và '(a, (b, c))' đánh giá 'a' rồi' b' rồi 'c'. –

+1

@ T.C .: Với một diễn viên (trống), đó là sự thật, nhưng có vẻ như tốt nhất để có được thói quen sử dụng bàn tay thích hợp. –

+0

@ T.C .: Và có, dàn diễn viên chức năng đẹp hơn. –

Các vấn đề liên quan