सी ++ में स्टेटिक फ़ंक्शन पॉइंटर टेबल/मैप

मेरे पास कुछ (जेनेरिक) हार्डवेयर के लिए एक हैंडलर का प्रतिनिधित्व करने वाला बेस क्लास है, जिसमें से विशिष्ट उदाहरण प्राप्त होते हैं। हैंडलर प्राप्त करने वाले कमांड प्रोटोकॉल में एक स्ट्रिंग शामिल है जो हैंडलर निष्पादित करने वाले फ़ंक्शन को निर्धारित करता है।

मैं हैश मैप (जो मूल रूप से std :: map के समान है, जैसा कि मुझे पता है, फ़ंक्शन पॉइंटर्स पर स्ट्रिंग्स का एक स्थिर मैपिंग बनाना चाहता हूं, इसलिए इसे और लागू करना चाहिए कम-से-कम JUCE और std ) के बराबर। मैं चाहता हूं कि यह स्थिर हो क्योंकि यह मैपिंग नहीं बदलेगा, और जब भी मैं एक हैंडलर को तुरंत चालू करता हूं (जो बहुत कुछ हो सकता है) मैं इसे पुनर्निर्माण नहीं करना चाहता हूं।

//general hardware handler
class HandlerBase {
public:

   //all command handlers take a BazCommand reference and return success
    typedef bool (HandlerBase::* commandHandler)(BazCommand&);

   //this is the mapping of String to the handler function that
   //determines which function to run when getting a command
    typedef HashMap CmdList;
}

// handler for the Foomatic Barrifier 2000
class FoomaticHandler : public HandlerBase {
public:

    //one of the Foomatic handler functions
    bool barrify(BazCommand& cmd) {
        return true;
    }

    static CmdList createCmdMapping() {
        CmdList l;

        l.set("bar", (commandHandler) &FoomaticHandler::barrify);
       //add all Foomatic handler functions here

        return l;
    }

    bool doCommand(BazCommand& cmd) {
        String cmdString = cmd.getCmdString();

        //execute correct function here
    }

    //this cmdList is static and shared betweeen all Foomatic handlers
    static CmdList cmdList;
}

// set up the Foomatic command hashmap
FoomaticHandler::CmdList FoomaticHandler::cmdList =
        FoomaticHandler::createCmdMapping();

हालांकि, यह दृष्टिकोण बहुत सारी त्रुटियों को उत्पन्न करता है। मैंने कई वैकल्पिक व्यवस्था की कोशिश की है। यह विशेष उत्पाद उत्पन्न करता है:

../core/../../../juce/JuceLibraryCode/modules/juce_audio_basics/../juce_core/containers/juce_HashMap.h: In static member function ‘static HandlerBase::CmdList FoomaticHandler::createCmdMapping()’:
 ../core/../../../juce/JuceLibraryCode/modules/juce_audio_basics/../juce_core/containers/juce_HashMap.h:445:5: error: ‘juce::HashMap::HashMap(const juce::HashMap&) [with KeyType = juce::String, ValueType = bool (HandlerBase::*)(BazCommand&), HashFunctionToUse = juce::DefaultHashFunctions, TypeOfCriticalSectionToUse = juce::DummyCriticalSection, juce::HashMap = juce::HashMap]’ is private
 FoomaticHandler.cpp:77:16: error: within this context

What is the right way to create such a static string -> member function mappings? And can the createCmdList() be made pure virtual to enforce implementation?

0
क्षमा करें, यह सिर्फ बेकार कोड कमी है। मैं std :: function को देखूंगा।
जोड़ा लेखक Inductiveload, स्रोत
आपको पैकेट हैंडलर के लिए कोई परिभाषा नहीं प्रतीत होती है, और आप फ़ूमैटहैंडलर में अवधारणाओं का उपयोग करते हैं जिन्हें हैंडलरबेस में परिभाषित किया गया है, भले ही आप इससे प्राप्त न हों। एक मानक तरीके से अपनी विधि कॉल को बांधने के तरीके के लिए std :: फ़ंक्शन को देखने का प्रयास करें।
जोड़ा लेखक woolstar, स्रोत

कोई जवाब नहीं है

0