(Lưu ý: Câu hỏi này là về việc không phải chỉ định số lượng phần tử và vẫn cho phép các kiểu lồng nhau được khởi tạo trực tiếp.)
Câu hỏi này thảo luận về việc sử dụng còn lại cho một mảng C như thế nào int arr[20];
. Về câu trả lời của mình , @James Kanze cho thấy một trong những thành trì cuối cùng của mảng C, đó là đặc điểm khởi tạo độc đáo:
int arr[] = { 1, 3, 3, 7, 0, 4, 2, 0, 3, 1, 4, 1, 5, 9 };
Chúng tôi không phải chỉ định số lượng các yếu tố, hoan hô! Bây giờ lặp lại nó với các chức năng C ++ 11 std::begin
và std::end
từ <iterator>
( hoặc các biến thể của riêng bạn ) và bạn không bao giờ cần phải nghĩ về kích thước của nó.
Bây giờ, có cách nào (có thể là TMP) để đạt được điều tương tự std::array
không? Sử dụng các macro được phép để làm cho nó trông đẹp hơn. :)
??? std_array = { "here", "be", "elements" };
Chỉnh sửa : Phiên bản trung gian, được tổng hợp từ nhiều câu trả lời khác nhau, trông như thế này:
#include <array>
#include <utility>
template<class T, class... Tail, class Elem = typename std::decay<T>::type>
std::array<Elem,1+sizeof...(Tail)> make_array(T&& head, Tail&&... values)
{
return { std::forward<T>(head), std::forward<Tail>(values)... };
}
// in code
auto std_array = make_array(1,2,3,4,5);
Và sử dụng tất cả các loại công cụ C ++ 11 thú vị:
- Mẫu biến thể
sizeof...
- tài liệu tham khảo giá trị
- chuyển tiếp hoàn hảo
std::array
, tất nhiên- khởi tạo thống nhất
- bỏ qua kiểu trả về với khởi tạo thống nhất
- kiểu suy luận (
auto
)
Và một ví dụ có thể được tìm thấy ở đây .
Tuy nhiên , như @Johannes chỉ ra trong nhận xét về câu trả lời của @ Xaade, bạn không thể khởi tạo các loại lồng nhau với chức năng như vậy. Thí dụ:
struct A{ int a; int b; };
// C syntax
A arr[] = { {1,2}, {3,4} };
// using std::array
??? std_array = { {1,2}, {3,4} };
Ngoài ra, số lượng bộ khởi tạo được giới hạn ở số lượng đối số hàm và mẫu được hỗ trợ khi triển khai.
TMP
câu hỏi của bạn là gì?