2012-12-18 20 views
5

trong khi chơi và cố gắng để tính toán tổng kích thước của vector tôi đã cố gắng một cái gì đó giống nhưTôi có thể sử dụng value_type trên một thể hiện của các véc tơ, không theo loại

vector<double> vd; 
auto area = vd.size()* sizeof (vd::value_type); 
//Ive seen Stepanov use area as name for this kind of size, idk if he adds the sizeof vd also to area :) 

Thật không may doesnt làm việc này ... tôi cần phải sử dụng vector<double>::value_type nhưng điều đó làm cho mã ít đọc được hơn. Nó có thể được thực hiện để làm việc? Tôi không thích sizeof vd.front() bởi vì nó chỉ trông xấu xí để viết front() cho việc này.
EDIT: decltype cũng biến thể phù hợp với những gì tôi sẽ gọi loại xấu xí ...

+1

Đối số để sizeof là không được đánh giá theo cách bạn đề nghị - nghĩ về nó theo cách này: trình biên dịch nhìn vào những gì 'vd.front 'trả về và áp dụng sizeof ở kiểu đó, không có cuộc gọi hàm nào xảy ra ở đây. – Fiktik

+0

đọc những gì tôi đã nói ... tôi biết kích thước của thời gian biên dịch ... chỉ .front() là xấu vì nó không báo hiệu ý định ... nó có thể là .back() [.size() - 1]. .. – NoSenseEtAl

+0

lời xin lỗi của tôi cho từ ngữ xấu ... thay thế "gọi" với "viết" nó rất dễ dàng để viết một điều trong khi suy nghĩ cái gì khác ...:/ – NoSenseEtAl

Trả lời

7

tôi nghĩdecltype thể được sử dụng:

auto area = vd.size() * sizeof(decltype(vd)::value_type); 

như bạn đang sử dụng auto tôi giả sử C++ 11 là được phép.

Xác nhận với g ++ v4.7.2 và clang v3.3.

+0

Hoạt động hoàn hảo. Lưu ý để nhật thực người dùng CDT: mã được gạch dưới (cảnh báo). Đó là một báo cáo dương tính giả. (biên dịch OK mặc dù) –

1

Trong C++ 11, bạn có thể sử dụng decltype(vd[0]):

auto area = vd.size()* sizeof (decltype(vd[0])); 

Nhưng trong kịch bản cụ thể, bạn có thể chỉ cần viết này:

auto area = vd.size()* sizeof (vd[0]); 

Kể từ khi biểu hiện bên sizeof (và decltype quá) sẽ không được đánh giá, cả hai sẽ hoạt động ngay cả khi vd là trống.

+2

bạn cũng có thể chỉ mất các decltype ... – Fiktik

+0

@ Fiktik: Tôi đã viết rằng quá. – Nawaz

+1

Điều này khá giống với 'sizeof vd.front()' được đề cập trong câu hỏi. – interjay

4

Làm thế nào về một hàm trợ giúp đơn giản?

template <typename Container> 
size_t value_size(const Container &) 
{ 
    return sizeof(typename Container::value_type); 
} 

[...] 

vector<double> vd; 
auto area = vd.size() * value_size(vd); 

Bạn thậm chí có thể quá tải chức năng để nó hoạt động với các bộ chứa khác như mảng (tất nhiên, bạn cũng cần phải quấn size).

Lý tưởng nhất, toàn bộ tính toán có thể được gói gọn trong một hàm tổng quát:

template <typename Container> 
size_t area(const Container &c) 
{ 
    return c.size() * sizeof(typename Container::value_type); 
} 

//possible overload for arrays (not sure it's the best implementation) 
template <typename T, size_t N> 
size_t area(const T (&arr)[N]) 
{ 
    return sizeof(arr); 
} 

[...] 

std::vector<double> vd; 
auto vd_area = area(vd); 
double arr[] = { 1., 2. }; 
auto arr_area = area(arr); 
+0

+1 Khá chắc chắn nó cần phải là 'sizeof (tên tệp Container :: value_type);' – hmjd

+0

@hmjd: Cảm ơn, đã sửa. –

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