2010-07-22 39 views
8

Giả sử bạn có một C++ 0x std :: thành viên mảng của một lớp mẫu và bạn muốn khởi tạo nó bằng phương tiện của một hàm tạo mất một vài vòng lặp:Khi khởi tạo std :: array

template <typename Tp, size_t N> 
class Test 
{ 
public: 
    template <typename Iterator> 
    Test(Iterator first, Iterator last) 
    { 
     if (std::distance(first,last) > N) 
      throw std::runtime_error("bad range"); 
     std::copy(first, last, _M_storage.begin()); 
    } 

private: 
    std::array<Tp, N> _M_storage; 

}; 

Giả sử rằng bạn đang cung cấp một phạm vi đồng dư với dung lượng lưu trữ của bạn, có thể khởi tạo mảng std :: trong bộ khởi tạo của hàm dựng, tránh các hàm tạo mặc định của Tps trong bộ nhớ không? Có thể khai thác std :: initializer_list <> trong trường hợp này không?

+1

Nhân tiện, số nhận dạng bắt đầu bằng dấu gạch dưới và được theo sau bởi một chữ hoa được đặt trước. Ngoài ra, nó phải là 'std :: distance (first, last)'. – GManNickG

+0

Đã sửa lỗi giám sát. Vấn đề với các nhà xây dựng mặc định thêm vẫn còn ... –

Trả lời

3

số

std::array là một tổng hợp, vì vậy bạn sẽ có được không có chức năng đặc biệt như nhà thầu tham gia vòng lặp. (Điều này thực sự làm tôi ngạc nhiên, với sự giới thiệu của std::initializer_list Tôi thấy không có hại trong việc tạo ra các nhà thầu hữu ích khác. Có lẽ một câu hỏi đang được lưu trữ.)

Điều này có nghĩa là cách duy nhất để sử dụng trình lặp để sao chép dữ liệu bên trong mảng là lặp lại và để làm điều đó, array phải được tạo và sẵn sàng để sử dụng.

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