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 के लिए भी अच्छा है।
प्रारंभकर्ता सूची के बारे में कैसे: (http://stackoverflow.com/questions/907471/c0x-initializer-list-example) – fileoffset
"मैन्युअल रूप से सरणी भरने के बिना" का क्या मतलब है? इसके अलावा, आपको यहां 'constexpr' की आवश्यकता नहीं है। यदि आप '_myVar' के आयामों को सेट कर रहे थे तो आप करेंगे। – juanchopanza
@juanchopanza: मुझे लगता है कि सवाल यह है: एक सामान्य तरीके से constexpr कार्यों का उपयोग कर एक constexpr सरणी कैसे भरें? – mirk