पर कॉन्स्टेक्सप्र का उपयोग कर एक ऐरे पॉप्युलेट करें मैं constexpr का उपयोग करके enum की एक सरणी पॉप्युलेट करना चाहता हूं। सरणी की सामग्री एक निश्चित पैटर्न का पालन करती है।कंपाइल-टाइम
मेरे पास एएससीआईआई चरित्र को चार श्रेणियों में अलग करने वाला एक enum है।
enum Type {
Alphabet,
Number,
Symbol,
Other,
};
constexpr Type table[128] = /* blah blah */;
मैं 128 Type
की एक सरणी रखना चाहता हूं। वे एक संरचना में हो सकते हैं। सरणी का सूचकांक ASCII वर्णों के अनुरूप होगा और मान प्रत्येक वर्ण के Type
होगा।
तो मैं इस सरणी से पूछ सकता हूं कि एएससीआईआई चरित्र किस श्रेणी से संबंधित है। कुछ
char c = RandomFunction();
if (table[c] == Alphabet)
DoSomething();
मैं जानना चाहता हूं कि यह कुछ लंबा मैक्रो हैक्स के बिना संभव है या नहीं।
वर्तमान में, मैं निम्न कार्य करके तालिका आरंभ करता हूं।
constexpr bool IsAlphabet (char c) {
return ((c >= 0x41 && c <= 0x5A) ||
(c >= 0x61 && c <= 0x7A));
}
constexpr bool IsNumber (char c) { /* blah blah */ }
constexpr bool IsSymbol (char c) { /* blah blah */ }
constexpr Type whichCategory (char c) { /* blah blah */ }
constexpr Type table[128] = { INITIALIZE };
जहां INITIALIZE
कुछ बहुत ही लंबा मैक्रो हैक्स के प्रवेश बिंदु है। कुछ की तरह
#define INITIALIZE INIT(0)
#define INIT(N) INIT_##N
#define INIT_0 whichCategory(0), INIT_1
#define INIT_1 whichCategory(1), INIT_2
//...
#define INIT_127 whichCategory(127)
मैं इस सरणी या एक संरचना इस मैक्रो हैक की आवश्यकता के बिना सरणी युक्त पॉप्युलेट करने के लिए एक तरह से चाहते हैं ...
हो सकता है कि जैसे
struct Table {
Type _[128];
};
constexpr Table table = MagicFunction();
तो कुछ सवाल यह है कि MagicFunction
कैसे लिखना है?
नोट: मैं cctype के बारे में पता कर रहा हूँ और पसंद करता है, इस सवाल का Is this the best way to do it?
बजाय एक Is this possible?
की अधिक है।
किसी भी मदद की सराहना की जाएगी।
धन्यवाद,
आप जानते हैं कि ASCII केवल '[0 .. 127] 'है? और 'char' की हस्ताक्षर कार्यान्वयन परिभाषित किया गया है? आपका वर्तमान दृष्टिकोण बहुत खतरनाक है। ओह, और आखिरी लेकिन कम से कम नहीं, सी ++ मानक ASCII एन्कोडिंग की बिल्कुल मांग नहीं करता है। यह भी ईबीसीडीआईसी हो सकता है। – Xeo
अच्छी खबर यह है कि चूंकि पैक के विस्तार के साथ सरणी शुरू की जा सकती है, जो आप पूछते हैं वह वास्तव में व्यवहार्य है। आपको केवल फ़ंक्शन को कई बार आह्वान करने की आवश्यकता है: पी –
अधिकतर संभव नहीं है क्योंकि C++ को वर्णों के लिए ASCII प्रतिनिधित्व की आवश्यकता नहीं है। साथ ही, सख्ती से, ASCII चरित्र सेट में केवल 128 वर्ण शामिल हैं। –