मैं C++ में विविधता टेम्पलेट का उपयोग करके विभिन्न एक्सेस कुंजियों के साथ एक मानचित्र को कार्यान्वित करने का प्रयास कर रहा हूं।विविधता वाले टेम्पलेट्स का उपयोग करके मल्टीकी मानचित्र
template<class V, class... Krest>
class MultikeyMap;
template<class V, class K, class... Krest>
class MultikeyMap<V, K, Krest...> : protected std::map<K, V>,
protected MultikeyMap<V, Krest...>
{
public:
template<class T>
void insert(const T& t, const V& v)
{
std::map<T, V>::insert(make_pair(t, v));
}
template<class T>
const V* find(const T& k)
{
typedef std::map<T,V> currentMap;
currentMap::const_iterator it = currentMap::find(k);
return it == currentMap::end() ? 0 : &it->second;
}
};
template<class V>
class MultikeyMap<V>
{};
मैं डालने में iterators वापस नहीं किया था और कोड सरल बनाने के लिए लगता है:
MultikeyMap<int, double, float> map1; // int and double are keys, float is value type
map1[ 2 ] = 3.5;
map1[ 5.7 ] = 22;
MultikeyMap<unsigned long long, int, float, double, int> map2; // more keys, int is value type
map2[100000000000ULL] = 56;
// etc...
क्या मैं अब की तरह दिखता है: क्या मैं प्राप्त करना चाहते हैं इस तरह के वाक्य रचना काम करने के लिए है।
मुझे इस समाधान में दो प्रमुख दोष दिखाई देते हैं।
पहले, मूल्य प्रकार पहले टेम्पलेट तर्क सूची में जाता है। शुरू में मैं
template<class K, class... Krest, class V>
class MultikeyMap<K, Krest..., V>
लिखने का प्रयास किया लेकिन संकलक का कहना है कि "अगर एक वर्ग टेम्पलेट आंशिक विशेषज्ञता के लिए एक तर्क एक पैकेट विस्तार है यह अंतिम तर्क होगा"।
दूसरा std :: नक्शे से संरक्षित विरासत है। मैं वास्तव में इसके बजाय संरचना का उपयोग करना चाहूंगा, लेकिन उस स्थिति में मुझे संग्रहीत मानचित्रों तक पहुंचने का कोई तरीका नहीं दिख रहा है। अगर वहाँ एक static_if था, मैं
template<class V, class K, class... Krest>
class MultikeyMap<V, K, Krest...> : protected MultikeyMap<V, Krest...>
{
public:
template<class T>
void insert(const T& t, const V& v)
{
static if(is_same<T,K>::value)
m_map.insert(make_pair(t, v));
else
MultikeyMap<V, Krest...>::insert(t, v);
}
private:
std::map<K,V> m_map;
};
समस्याओं मैंने कहा पर कृपया सलाह लिखेंगे। यदि कोई बेहतर दृष्टिकोण है, तो मुझे सीखने में खुशी होगी।
पढ़ने के लिए धन्यवाद।
'MultikeyMap <अहस्ताक्षरित लंबे, पूर्णांक, पूर्णांक, डबल, int > ':' int' को दो बार कुंजी के रूप में उद्धृत किया गया है, क्या वास्तव में इसका इरादा है? आप कैसे जान रहे हैं कि उपयोगकर्ता पहले या दूसरे 'int' द्वारा देख रहा है या नहीं? साथ ही, यह मेरे लिए अस्पष्ट है कि आप क्या हासिल करने की कोशिश कर रहे हैं; क्या एक मूल्य सभी मानचित्रों में एक बार में उपस्थित होना चाहिए? क्योंकि अगर यह सिर्फ एक मानचित्र में है तो एक बड़ा आम कंटेनर रखने में कोई बात नहीं है। –
@MatthieuM .: बिंदु के लिए धन्यवाद, एक int होना चाहिए। मान अब के लिए एक मानचित्र में मौजूद होना चाहिए, लेकिन बाद में मैं पहले से संग्रहीत मूल्य के लिए एक और कुंजी जोड़ने की क्षमता जोड़ने जा रहा हूं। –