Thời gian dài trở lại tôi đã thấy một triển khai không đệ quy để lấy giá trị/loại cuối cùng từ chuỗi thứ tự/giá trị kiểu. Nó có một thuộc tính tốt đẹp, rằng số lượng khuôn mẫu được khởi tạo là độc lập (và không đổi) của số phần tử mà trình tự chứa.Có thể triển khai at_c không đệ quy không?
Việc thực hiện rất đơn giản, như sau
// a struct that eats anything and everything
struct eat { template<class T> eat(T&&) {} };
// generates V matching with U
template<class U, class V> struct match { using type = V; };
template<class... X> struct back_
{
template<class U>
static U&& get(typename match<X, eat>::type..., U&& u)
{
return static_cast<U&&>(u); // forward
}
};
// simple macro to avoid repetition for trailing return type.
#define RETURNS(exp) -> decltype(exp) { return exp; }
// get the last value in meta O(1)
template<class T, class... Ts>
auto back(T&& t, Ts&&... ts) RETURNS(back_<Ts...>::get(static_cast<T&&>(t), static_cast<Ts&&>(ts)...))
Nó sử dụng một thực tế đơn giản mà đưa ra một loại variadic X...
trình biên dịch không đệ quy có thể tạo ra một loại T
càng nhiều càng X
s ở đó. Vì vậy, tôi muốn biết là có một cách để mở rộng nó để thực hiện at_c
hoặc nth
chức năng với số lượng không đổi của các mẫu instantiated (độc lập với số lượng các phần tử).
Nó cũng có thể được phrased như, cung cấp cho một loại variadic X...
và một số nguyên N
, là nó có thể không đệ quy tạo ra một tiểu chuỗi X...
gồm N
yếu tố?
Bạn chỉ có thể cung cấp số lượng quá tải vô hạn, theo cách thủ công có thông số và công cụ đầu tiên 1, 2, 3, 4, 6, .... Khác hơn thế, tốt nhất bạn có thể nhận được là 'log N' tôi tin. – Xeo
@Xeo Bạn có thể tắt 'log log N' với một đệ quy phát triển đủ nhanh? Khá vô nghĩa, như giới hạn đệ quy 1000 dưới 'log N' là vô cùng xa, và chi phí của việc rút độ sâu đệ quy' log log N' sẽ cao hơn mức chênh lệch cho bất kỳ 'N' ... – Yakk
Hãy dừng lại sử dụng 'static_cast' như thế. Chúng ta có ['std :: forward'] (http://en.cppreference.com/w/cpp/utility/forward) vì một lý do: nó dễ đọc hơn và thực sự nói với người đọc * tại sao * bạn đang làm nó , không giống như 'static_cast' là phức tạp và vô nghĩa đối với những người không biết. –