में मामलों के रूप में निरंतर सरणी के तत्वों का उपयोग करके मैं कमांड के सेट पर कुंजी प्रेस के सेट को मैप करने का प्रयास कर रहा हूं। चूंकि मैं कई स्थानों से कमांड को संसाधित करता हूं, इसलिए मैं कुंजी और कमांड के बीच अमूर्तता की एक परत स्थापित करना चाहता हूं ताकि अगर मैं अंतर्निहित कुंजी मैपिंग बदलूं, तो मुझे बहुत अधिक कोड बदलने की ज़रूरत नहीं है। मेरे वर्तमान प्रयास इस तरह दिखता है:स्विच स्टेटमेंट
// input.h
enum LOGICAL_KEYS {
DO_SOMETHING_KEY,
DO_SOMETHING_ELSE_KEY,
...
countof_LOGICAL_KEYS
};
static const SDLKey LogicalMappings[countof_LOGICAL_KEYS] = {
SDLK_RETURN, // Do Something
SDLK_ESCAPE, // Do Something Else
...
};
// some_other_file.cpp
...
switch(event.key.keysym.key) {
case LogicalMappings[ DO_SOMETHING_KEY ]:
doSomething();
break;
case LogicalMappings[ DO_SOMETHING_ELSE_KEY ]:
doSomethingElse();
break;
...
}
जब मैं इस (जीसीसी 4.3.2) संकलित करने के लिए मैं त्रुटि संदेश मिलता है कोशिश:
error: 'LogicalMappings' cannot appear in a constant-expression
मैं देख रहा हूँ क्यों नहीं संकलक एक समस्या है इसके साथ। मैं समझता हूं कि आपको केस स्टेटमेंट में चर होने की अनुमति क्यों नहीं है, लेकिन मैं इस धारणा के तहत था कि आप स्थिरांक का उपयोग कर सकते हैं, क्योंकि उनका संकलन समय पर मूल्यांकन किया जा सकता है। निरंतर सरणी स्विच स्टेटमेंट के साथ काम नहीं करते हैं? यदि ऐसा है, तो मुझे लगता है कि मैं सरणी को केवल कुछ के साथ बदल सकता हूं:
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING = SDLK_RETURN;
static const SDLKey LOGICAL_MAPPING_DO_SOMETHING_ELSE = SDLK_ESCAPE;
...
लेकिन यह बहुत कम सुरुचिपूर्ण लगता है। क्या कोई जानता है कि आप यहां निरंतर सरणी का उपयोग क्यों नहीं कर सकते?
संपादित करें: मैंने सी ++ मानक का थोड़ा सा देखा है जो दावा करता है कि, "एक अभिन्न निरंतर अभिव्यक्ति में केवल शाब्दिक (2.13), एन्युमेटर, कॉन्स वैरिएबल या स्थिरांक के साथ शुरू किए गए अभिन्न या गणना प्रकारों के स्थिर डेटा सदस्य शामिल हो सकते हैं अभिव्यक्तियां (8.5) ... "। मैं अभी भी नहीं देखता कि क्यों एक स्थिर सरणी एक निरंतर अभिव्यक्ति के साथ शुरू की गई गणना प्रकार के रूप में नहीं गिना जाता है। यह हो सकता है कि मेरे प्रश्न का उत्तर "क्योंकि यह वही तरीका है," और मुझे इसके आसपास काम करना होगा। लेकिन अगर ऐसा है, तो यह निराशाजनक है, क्योंकि संकलक वास्तव में संकलित समय पर उन मानों को निर्धारित कर सकता है।
"एक निरंतर अभिव्यक्ति के साथ प्रारंभिक गणना प्रकार" कुछ है "MyEnum a = 12", जहां MyEnum एक enum प्रकार है (यानी enum कीवर्ड के साथ घोषित/परिभाषित)। एक सरणी-enum प्रकार enum प्रकार के समान नहीं है कि यह एक सरणी है। –