2012-05-10 18 views
7

मुझे आश्चर्य है कि एक संपूर्ण सरणी को एक कॉन्स्टेक्स फ़ंक्शन (सी ++ 2011 के साथ) प्रारंभ करना संभव है।एक constexpr के साथ एक सरणी शुरू करना?

template<unsigned int DIM> const unsigned int MyClass<DIM>::_myVar[2][3] = { 
{metaFunction(0, 0, DIM), metaFunction(0, 1, DIM), metaFunction(0, 2, DIM)}, 
{metaFunction(1, 0, DIM), metaFunction(1, 1, DIM), metaFunction(1, 2, DIM)} 
}; 

template<unsigned int DIM> inline constexpr unsigned int MyClass<DIM>::metaFunction(const unsigned int k, const unsigned int n, const unsigned int dim) 
{ 
    return (((n < dim) && (k < n)) ? (1<<(n-k)) : (0)); 
} 

वहाँ सरणी मैन्युअल भरने के बिना एक constexpr साथ myVar प्रारंभ करने का कोई तरीका है: यहाँ मैं वर्णन करने के लिए मुझे क्या करना चाहते हैं कुछ है। और यदि यह मौजूद है, तो दिए गए उदाहरण के लिए वाक्यविन्यास क्या होगा?

प्रश्न को थोड़ा सटीक करने के लिए, मैं एक एकल फ़ंक्शन कॉल का उपयोग करके myVar के सभी मानों को भरने का एक तरीका खोजता हूं।

+0

प्रारंभकर्ता सूची के बारे में कैसे: (http://stackoverflow.com/questions/907471/c0x-initializer-list-example) – fileoffset

+2

"मैन्युअल रूप से सरणी भरने के बिना" का क्या मतलब है? इसके अलावा, आपको यहां 'constexpr' की आवश्यकता नहीं है। यदि आप '_myVar' के आयामों को सेट कर रहे थे तो आप करेंगे। – juanchopanza

+0

@juanchopanza: मुझे लगता है कि सवाल यह है: एक सामान्य तरीके से constexpr कार्यों का उपयोग कर एक constexpr सरणी कैसे भरें? – mirk

उत्तर

3

MyClass की परिभाषा को देखे बिना समस्या बिल्कुल स्पष्ट नहीं है। मुझे विश्वास है कि आप MyClass::_myVar कोड के बिना प्रारंभिक रूप से MyClass::metaFunction() मानों के साथ इसे भरने के लिए प्रारंभ करना चाहते हैं।

आप कोड बताते हैं कि MyClass::_myVar एक स्थिर वर्ग सदस्य है। उस मामले में सदस्य का प्रारंभिकरण पूरी तरह से अच्छा C++ 11 है जैसा कि यह खड़ा है। निम्नलिखित कार्यक्रम दिखाता है (जीसीसी 4.6.3):

#include <iostream> 

/* MyClass Version 1 */ 
template<unsigned int DIM> 
struct MyClass 
{ 
    static constexpr unsigned int metaFunction(
     const unsigned int k, 
     const unsigned int n, 
     const unsigned int dim); 

    static const unsigned int _myVar[2][3]; 
}; 

template<unsigned int DIM> inline constexpr 
unsigned int MyClass<DIM>::metaFunction(
    const unsigned int k, 
    const unsigned int n, 
    const unsigned int dim) 
{ 
    return (((n < dim) && (k < n)) ? (1<<(n-k)) : (0)); 
} 

template<unsigned int DIM> const unsigned int MyClass<DIM>::_myVar[2][3] = { 
    { metaFunction(0, 0, DIM), 
     metaFunction(0, 1, DIM), 
     metaFunction(0, 2, DIM) 
    }, 
    { metaFunction(1, 0, DIM), 
     metaFunction(1, 1, DIM), 
     metaFunction(1, 2, DIM) 
    } 
}; 

template<unsigned int DIM> inline constexpr 
unsigned int MyClass<DIM>::metaFunction(
    const unsigned int k, 
    const unsigned int n, 
    const unsigned int dim) 
{ 
    return (((n < dim) && (k < n)) ? (1<<(n-k)) : (0)); 
} 

using namespace std; 

int main(void) 
{ 
    MyClass<3> mine; 
    for (int i = 0; i < 2; ++i) { 
     for (int j = 0; j < 3; ++j) { 
      cout << mine._myVar[i][j] << endl; 
     } 
    } 
    return 0; 
} 

यह पतला मुझे लगता है कि MyClass::_myVar एक स्थिर सदस्य है नहीं - हालांकि क्यों पूर्णांक स्थिरांक की इस सरणी स्थिर नहीं होगा मुझे यकीन है कि नहीं कर रहा हूँ । अगर ऐसा है, तो आप सदस्य डिफ़ॉल्ट निर्माता में uniform initialization provision of C++11 का उपयोग कर प्रारंभ कर सकते हैं:

/* MyClass Version 2 */ 
template<unsigned int DIM> 
struct MyClass 
{ 
    MyClass() 
    : _myVar{ 
      { MyClass::metaFunction(0, 0, DIM), 
       MyClass::metaFunction(0, 1, DIM), 
       MyClass::metaFunction(0, 2, DIM) 
      }, 
      { MyClass::metaFunction(1, 0, DIM), 
       MyClass::metaFunction(1, 1, DIM), 
       MyClass::metaFunction(1, 2, DIM) 
      } 
    }{} 

    static constexpr unsigned int metaFunction(
     const unsigned int k, 
     const unsigned int n, 
     const unsigned int dim); 

    const unsigned int _myVar[2][3]; 
}; 

न मामले में metaFunction वास्तव में संकलन के लिए आवश्यक की constexpr विशेषता है। और यदि constexpr हटा दिया गया है तो /* MyClass Version 1*/ सी ++ 03 के लिए भी अच्छा है।

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