6

निम्न प्रकार की विशेषता को देखते हुए, मैं std::pair एस के साथ Fields कैसे प्रारंभ कर सकता हूं?किसी प्रकार की विशेषता के स्थिर std :: unordered_map को कैसे प्रारंभ करें?

template <> 
struct ManagerDataTrait<Person> 
{ 
    static const std::unordered_map<std::string, std::string> Fields; 
    // ... 
}; 

मैं एक लैम्ब्डा उपयोग करने की कोशिश, लेकिन दृश्य स्टूडियो का कहना है कि Fields एक इकाई है कि स्पष्ट रूप से विशेष किया जा सकता है नहीं है।

template <> 
const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields = []{ 
    std::unordered_map<std::string, std::string> fields; 
    fields.insert(std::make_pair("height", "FLOAT")); 
    fields.insert(std::make_pair("mass", "FLOAT")); 
    return fields; 
}; 

अगर कोई लक्षण में इस तरह स्थिर सदस्यों का उपयोग करने के कोई रास्ता नहीं है, जो विकल्प मैं एक विशेषता में जानकारी स्टोर करना है? (Fields में एक SQL डेटाबेस संरचना है।)

अद्यतन: सदस्य const भी हो सकता है लेकिन यह बिंदु नहीं होना चाहिए।

+0

अपने लैम्ब्डा के लिए कुछ काम करने के लिए वास्तव में लैम्ब्डा _run_ करने की आवश्यकता होगी, लेकिन आप ऐसा करने के लिए प्रयास नहीं किया है कि (आपने अभी लैम्ब्डा से हैश मैप बनाने की कोशिश की है, जो मान्य नहीं है, लेकिन निश्चित रूप से लैम्ब्डा नहीं चलाता है।) –

उत्तर

7

Kerrek एस.बी. के जवाब सामान्य रूप में सही जवाब होगा:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ 
    { "blah", "blah" } 
    // ... 
}; 

(एनबी कोई template<> क्योंकि आप एक विशेषज्ञता के एक सदस्य तय कर रहे हैं, एक विशेषज्ञता नहीं)

लेकिन उस विजुअल सी ++ द्वारा समर्थित नहीं है, इसलिए दूसरा विकल्प फ़ंक्शन कॉल के साथ मानचित्र को प्रारंभ करना है, और फ़ंक्शन से इच्छित सामग्री के साथ एक मानचित्र वापस करना है:

std::unordered_map<std::string, std::string> 
getFields() 
{ 
    std::unordered_map<std::string, std::string> fields; 
    fields["blah"] = "blah"; 
    // ... 
    return fields; 
} 

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields = getFields(); 

एक लैम्ब्डा एक ही चीज़ करने के लिए सिंटैक्टिक चीनी है, और मुझे यकीन नहीं है कि यह लैम्ब्डा का उपयोग करने के लिए स्पष्ट है क्योंकि वाक्यविन्यास थोड़ा उलझन में है।

16

आपको एहसास है कि आप ब्रसेड सूचियों से मानचित्र प्रारंभ कर सकते हैं?

std::unordered_map<std::string, std::string> m { { "a", "bc" } 
               , { "b", "xy" } 
//            ... 
               }; 
+0

समाधान 'टेम्पलेट <>' से छुटकारा पाने के लिए था, जिसे आपने इंगित किया था अब हटाए गए टिप्पणी में बाहर। क्या आप इसे अपने उत्तर में जोड़ सकते हैं? मैं इसे स्वीकार किए जाने के रूप में चिह्नित करूंगा। – danijar

+0

मैंने ऐसी टिप्पणी बनाई (और हटा दी), क्या आपका मतलब है? –

+0

@ जोनाथन वाकई आप सही हैं, मेरा मतलब आपकी टिप्पणी है। मैंने इसे मिश्रित किया। – danijar

0

विजुअल C++ अब, braced सूची से स्थिर आरंभीकरण का समर्थन करता है तो आप कुछ इस तरह कर सकता है:

const std::unordered_map<std::string, std::string> ManagerDataTrait<Person>::Fields{ { "abc", "xyz" }, { "cde", "zyx" } ...}; 
संबंधित मुद्दे