2012-12-18 39 views
5

जबकि खेल रहे हैं और वेक्टर का कुल आकार की गणना करने की कोशिश कर रहा तरहमैं वेक्टर का एक उदाहरण पर VALUE_TYPE उपयोग कर सकते हैं, अपने प्रकार पर नहीं

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 :) 

दुर्भाग्य से यह काम नहीं करता है कुछ करने की कोशिश की ... मैं करने की जरूरत है vector<double>::value_type का उपयोग करें, लेकिन यह कोड को कम पढ़ने योग्य बनाता है। क्या इसे काम करने के लिए बनाया जा सकता है? मुझे sizeof vd.front() पसंद नहीं है क्योंकि यह इसके लिए front() लिखने के लिए बदसूरत लग रहा है।
संपादित करें: decltype भी में फिट वेरिएंट क्या मैं बदसूरत श्रेणी कहेंगे ...

+1

sizeof को तर्क जिस तरह से आप का सुझाव में मूल्यांकन नहीं किया गया है - इस तरह से यह के बारे में सोच: संकलक क्या 'vd.front पर लग रहा है 'उस प्रकार पर आकार लौटाता है और लागू होता है, यहां कोई फ़ंक्शन कॉल नहीं होता है। – Fiktik

+0

मैंने जो कहा वह पढ़ा ... मुझे पता है कि आकार का संकलन समय है ... बस .front() बदसूरत है क्योंकि यह इरादा को संकेत नहीं देता है ... यह .back() [.size() - 1] हो सकता है। .. – NoSenseEtAl

+0

खराब शब्द के लिए मेरी माफ़ी ... "लिखने" के साथ "कॉल" को प्रतिस्थापित किया गया है और कुछ और सोचते समय एक चीज़ लिखना आसान है ...:/ – NoSenseEtAl

उत्तर

7

मुझे लगता है कि decltype इस्तेमाल किया जा सकता:

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

के रूप में आप auto उपयोग कर रहे हैं मुझे लगता है सी ++ 11 है अनुमति है।

g ++ v4.7.2 और clang v3.3 के साथ पुष्टि की।

+0

पूरी तरह से काम करता है। सीडीटी उपयोगकर्ताओं को ग्रहण करने के लिए नोट: कोड रेखांकित (चेतावनी) है। यह एक झूठी सकारात्मक की सूचना दी है। (हालांकि ठीक है संकलित करें) –

1

सी ++ 11 में, आप decltype(vd[0]) इस्तेमाल कर सकते हैं:

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

लेकिन विशेष परिदृश्य में, आप सिर्फ इस लिख सकते हैं:

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

sizeof (और decltype भी अंदर अभिव्यक्ति के बाद से) का मूल्यांकन नहीं किया जाएगा, दोनों vd खाली होने पर भी काम करेंगे।

+2

आप भी अस्वीकार कर सकते हैं ... – Fiktik

+0

@ फ़िक्टिक: मैं भी उसे लिख रहा था। – Nawaz

+1

यह प्रश्न में उल्लिखित 'sizeof vd.front()' जैसा ही है। – interjay

4

एक साधारण सहायक समारोह के बारे में कैसे?

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); 

तुम भी समारोह को ओवरलोड सकता है इतना है कि यह इस तरह के सरणियों के रूप में अन्य कंटेनरों के साथ काम करता (जाहिर है, आप size रैप करने के लिए और साथ ही आवश्यक है)।

आदर्श रूप में, पूरे गणना एक सामान्य समारोह में लपेटा जा सकता है:

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 बहुत यकीन है कि इसे 'sizeof (typename कंटेनर :: value_type) होना चाहिए; ' – hmjd

+0

@hmjd: धन्यवाद, तय किया गया। –