2011-11-24 19 views
12

Tôi tìm thấy mẫu sau trên một blog:Biến dạng kích thước mảng - có tăng cường ở đâu đó không?

template <typename T, size_t N> 
struct array_info<T[N]> 
{ 
    typedef T type; 
    enum { size = N }; 
}; 

Đó là một sự thay thế thanh lịch để sizeof(a)/sizeof(a[0]).

Một cấu trúc thường được sử dụng để nhận được kích thước của một mảng chắc chắn nên ở đâu đó trong thư viện. Tôi không biết một. Bất cứ ai có thể cho tôi biết chức năng này là trong thư viện chuẩn một nơi nào đó và/hoặc trong Tăng cường? Tốt hơn là ở dạng dễ sử dụng và nhẹ.

+0

Có hàm chuẩn '_countof' (bạn cần phiên bản mẫu của nó), nhưng tôi không thể tìm thấy tiêu đề phù hợp vào lúc này. – Vlad

+1

Sử dụng std :: array thay thế. –

Trả lời

24

tôi cuối cùng đã tìm thấy câu trả lời bản thân mình - boost::size() :

#include <boost/range.hpp> 

int array[10]; 
boost::size(array); // returns 10 
5

Trong tiêu chuẩn C++ mới, std :: mảng từ tiêu đề có kích thước phương thức(), trả về một constexpr và do đó có sẵn tại thời gian biên dịch.

Bạn sẽ có thể để một cái gì đó giống như

std::array< YourType, N > arr; 
constexpr auto totalSize = arr.size() * sizeof(std::array< YourType, N >::value_type); 

Hope this helps ...

+0

+1 Thật vậy: Nếu bạn muốn một giải pháp trong "tinh thần của C++", hãy sử dụng 'std :: array'. –

0

Bạn cần có lẽ là vĩ mô _countof. Theo số http://www.cplusplus.com/forum/beginner/54241/, số này được định nghĩa bằng số <cstdio>. Nhưng tôi không chắc chắn nếu nó có sẵn bên ngoài Visual C++.

Dù sao, việc tạo tệp tiêu đề không phức tạp và đặt định nghĩa của bạn ở đó.


Cập nhật:
_countof là Microsoft-cụ thể, nhưng có một cuộc thảo luận về các trình biên dịch khác tại đây: Equivalents to MSVC's _countof in other compilers?

1

Nếu có thể, tôi cũng muốn giới thiệu std::array hoặc boost::array nếu có thể. Điều đó nói rằng, bạn cũng có thể sử dụng boost::extent để có được kích thước mảng và boost::remove_all_extents để có được loại thực tế.

Trong C++ 11, các đặc điểm kiểu cũng có sẵn trong thư viện chuẩn.

Edit: Nếu bạn đang tìm kiếm một chức năng hoạt động trên các biến, thay vào đó các loại, hãy thử như sau

template <typename T, std::size_t N> 
std::size_t array_count(const T(&) [N]) { return N; } 

Xem một ví dụ về sử dụng tại http://ideone.com/IOdfp

+0

'boost :: extent' dường như hoạt động trên các loại, không phải đối tượng. Tôi cần một cái gì đó hoạt động trên một đối tượng mảng, ví dụ: 'v' trong' char * v [] = {/*...*/} ' – paperjam

+0

@paperjam. Tôi đã hiểu lầm những gì bạn muốn. Xem cập nhật của tôi. –

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