एक परियोजना में मैं हाल ही में मदद कर रहा हूं, संपूर्ण कोड बेस एक राक्षसी enum पर निर्भर करता है जो प्रभावी रूप से एक गौरवशाली हैश टेबल के लिए चाबियों के रूप में उपयोग किया जाता है। एकमात्र समस्या यह है कि यह बहुत बड़ा है, जब भी enum परिवर्तन मूल रूप से पहले से ही बड़े कोड बेस के लिए पुनर्निर्माण होता है। यह हमेशा के लिए लेता है और मैं वास्तव में इसे बदलने के लिए प्यार करता हूँ।Enums का दुरुपयोग करने के लिए एक वैकल्पिक खोजना
enum Values
{
Value = 1,
AnotherValue = 2,
<Couple Thousand Entries>
NumValues // Sentinel value for creating arrays of the right size
}
क्या मैं के लिए देख रहा हूँ तरीके इस enum को बदलने के लिए है, लेकिन अभी भी एक प्रणाली typesafe (कोई अनियंत्रित तार) है और यह भी MSVC2010 (कोई constexpr) के साथ संगत है कि है। अतिरिक्त संकलन ओवरहेड स्वीकार्य है क्योंकि यह फाइलों के समूह को दोबारा बनाने की तुलना में संकलित करने के लिए अभी भी कम समय हो सकता है।
मेरे वर्तमान प्रयास मूल रूप से लिंक समय तक मूल्यों को परिभाषित करने में देरी के रूप में संक्षेप में समझा जा सकता है।
इसके उपयोग के उदाहरण
GetValueFromDatabase(Value);
AddValueToDatabase(Value, 5);
int TempArray[NumValues];
संपादित करें: Compiletime और रनटाइम preprocessing स्वीकार्य है। रनटाइम पर किसी प्रकार की कैशिंग डेटा संरचना को बंद करने के साथ-साथ।
// key.h
namespace keys {
// Identifies a unique key in the database
class Key {
public:
// The numeric ID of the key
virtual size_t id() const = 0;
// The string name of the key, useful for debugging
virtual const std::string& name() const = 0;
};
// The total number of registered keys
size_t count();
// Internal helpers. Do not use directly outside this code.
namespace internal {
// Lazily allocates a new instance of a key or retrieves an existing one.
const Key& GetOrCreate(const std::string& name, size_t id);
}
}
#define DECLARE_KEY(name) \
extern const ::keys::Key& name
#define DEFINE_KEY(name, id) \
const ::keys::Key& name = ::keys::internal::GetOrCreate(STRINGIFY(name), id)
कोड के साथ:
* "जब भी enum परिवर्तन मूल रूप से पहले से ही बड़े कोड बेस के लिए पुनर्निर्माण होता है तो संकलित करना" * मुझे लगता है कि आपको स्वत: निर्माण प्रक्रिया के लिए समर्थन की आवश्यकता है?उदाहरण के लिए, यदि आप संख्याओं का नाम देने के लिए (सी ++) * पहचानकर्ता * का उपयोग करते हैं, तो उन पहचानकर्ताओं को उनके उपयोग से पहले घोषित करने की आवश्यकता है। यदि यह केंद्रीय शीर्षलेख फ़ाइल में किया जाता है, और आपको अतिरिक्त पहचानकर्ता जोड़ने की आवश्यकता है, तो बिल्ड टूल परिवर्तन का पता लगाएगा और इसमें शामिल प्रत्येक स्रोत फ़ाइल को पुन: संकलित करेगा। क्या आपकी निर्माण प्रक्रिया में इस हेडर फ़ाइल के लिए ऐसी सुविधा को निष्क्रिय करने के लिए संभव हो सकता है? – dyp