2015-10-30 8 views
6

मैं संभवतः कल्पना नहीं कर सकता कि यह क्यों चुना गया था कि std::bitset::size गैर स्थैतिक है। यह constexpr आकार प्राप्त करना बहुत कठिन बनाता है;std :: bitset :: आकार गैर-स्थिर

template<int val> 
struct int_ 
{ 
    static const constexpr value = val; 
}; 

template<size_t size> 
auto getBitsetSizeIMPL(std::bitset<size>) 
{ 
    return int_<size>{}; 
} 

template<typename BitsetType> 
constexpr size_t getBitsetSize() 
{ 
    return decltype(getBitsetSizeIMPL(BitsetType{}))::value; 
} 

जब अगर यह स्थिर थे तुम सब करने के लिए होता

BitsetType::size() 

होगा और कार्यक्षमता का कोई बलिदान नहीं होगा: आप कुछ इस तरह लिखने के लिए की है।

क्या कोई ऐतिहासिक कारण है कि मुझे याद आ रही है या क्या कोई तकनीकी तथ्य है जो मुझे याद नहीं है?

+1

Fwiw, आप 'BitsetType {} आकार कर सकते हैं()'। – cpplearner

+0

सच है! इसके बारे में नहीं सोचा था। यह बहुत बेहतर है। लेकिन फिर भी, किसी भी कारण से यह स्थैतिक नहीं हो सकता है? –

+0

वही कारण है कि 'std :: array :: size' स्थिर नहीं है, मैं कल्पना करता हूं। कोई पिछले हफ्ते के बारे में पूछ रहा था। –

उत्तर

1

एक नहीं constexprstd::bitset::size की धारणा गलत है:।

std::size_t size() const; // until C++11 
constexpr std::size_t size(); // since C++11, until C++14 
constexpr std::size_t size() const; // since C++14) 
+0

लेकिन उन लोगों का उपयोग करने के लिए, आपको एक कॉन्सएक्सप्रस बिटसेट होना चाहिए। यह स्थिर नहीं है। –

+0

@RussellGreene: और? –

+0

आप इस सवाल का जवाब नहीं दे रहे हैं। मुझे पता है कि यह constexpr है। मैं सिर्फ उत्सुक हूं कि उन्होंने उस डिजाइन विकल्प को क्यों चुना। –

संबंधित मुद्दे