2015-03-05 15 views
5

Đây là thành ngữ trong câu hỏi:Làm thế nào để gọi thành ngữ của việc sử dụng một mảng để áp dụng một chức năng để một gói variadic

template<typename... T> 
void f(T... t) { 
    int temp[] = {(g(t), 0)...}; 
} 

này sẽ được biên dịch như g(t0); g(t1); ..., trật tự của chức năng cuộc gọi được đảm bảo bởi C + +11 [dcl.init.list]/4.
Phiên bản tốt hơn sử dụng std::initializer_list thay vì mảng, nhưng không quan trọng ở đây.

Câu hỏi đặt ra là: chúng ta nên gọi thành ngữ này như thế nào?

UPD:
Về cơ bản, đó là thành ngữ mà chúng ta nên tư vấn cho những người sử dụng nó thay vì đệ quy, tức là để thay thế hai quá tải
void f() {}
void f(H head, T... tail) { g(head); f(tail...); }
với single
void f(T... t) { int temp[]{(g(t), 0)...}; }

Tất nhiên chúng ta có thể gọi nó là "Một thành ngữ sẽ được thay thế bởi Fold Expressions" nhưng tôi hy vọng có một thuật ngữ thích hợp cho nó.

+0

Btw, trong C++ 1Z điều này có lẽ sẽ được thay thế bởi [Gấp Expressions] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4295.html) – Abyx

+0

"gói mở rộng" dường như bao gồm nó, có? –

+0

@ Cheersandhth.-Alf, cảm ơn, đã sửa. Không, nó không chỉ là một "gói mở rộng" - sử dụng mảng đóng một phần quan trọng ở đây. Đó là kinda "này idion vs đệ quy" điều – Abyx

Trả lời

1

Mở rộng gói.

C++ 11 §5.1.2/23 trong [expr.prim.lambda]:

Một chụp Tiếp theo một dấu chấm lửng là một mở rộng gói (14.5.3). [Ví dụ:

template<class... Args> 
void f(Args... args) { 
    auto lm = [&, args...] { return g(args...); }; 
    lm(); 
} 

-end dụ]

Tôi nghĩ rằng bao gồm nó. Việc mở rộng gói mà không áp dụng một hàm có thể được xem là một hàm áp dụng một hàm nhận dạng.

C++ 11 §14.5.3/4 trong [temp.variadic]:

Một mở rộng gói bao gồm một mô hình và một dấu chấm lửng, instantiation trong đó sản xuất không hay nhiều instantiations của mẫu trong danh sách (được mô tả bên dưới). [& hellip;]

+0

không, nó không phải về việc mở rộng gói. Nó giống như (trong) nổi tiếng '0 == x' thành ngữ không phải là về' operator == '. Đó là về cách bạn thay thế giải nén đệ quy bằng cách mở rộng gói bên trong một bộ khởi tạo nhanh. – Abyx

+0

Làm thế nào về, "* sử dụng * mở rộng gói" sau đó? –

+0

no-no, look - với cách tiếp cận đệ quy, chúng ta cũng có mở rộng gói - 'void f (H h, T ... t) {g (h); f (t ...); } ' – Abyx

0

Có lẽ "chức năng mở rộng cuộc gọi trên gói thông số"?

+1

tôi cũng tin rằng nó nên có "mảng" trong tên của nó, bởi vì ví dụ sử dụng một hàm trợ giúp 'template void ăn (T ...) {}' và sau đó 'ăn (g (t) ...);' cũng là một "hàm gọi mở rộng qua gói tham số" nhưng nó không làm thứ tự - các cuộc gọi không được đảm bảo. – Abyx

0

Hãy phân biệt gấp và ánh xạ. lần lượt hàng loạt dữ liệu đầu vào thành một giá trị duy nhất. bản đồ biến loạt đầu vào thành chuỗi đầu ra. (Tất nhiên, ánh xạ có thể được biểu diễn dưới dạng các chuỗi vô hướng gấp thành một danh sách đơn).

Ở đây chúng tôi ánh xạ tất cả các đầu vào thành giá trị rỗng. Nếu chúng ta làm nổi bật tác dụng phụ của g (x0), g (x1), vv - chúng ta có thể nói về ánh xạ. Nếu chúng ta làm nổi bật khoảng trống sản xuất, chúng ta có thể nói về nếp gấp tinh khiết. Nhưng điều này là vô nghĩa, tôi nghĩ vậy.

std :: transform là ánh xạ. std :: tích lũy gấp. Std :: for_each là gì? Lập bản đồ hoặc gấp? (BTW, nó được gấp, bởi vì nó trả về một đối tượng hàm trạng thái với trạng thái tích luỹ). Theo như chức năng đầu vào là unary, không nhị phân, nó được lập bản đồ (hợp nhất với gấp).

So. Tôi muốn đưa ra thành ngữ này "variadic for-each".

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