std::vector aus Funktionspointern: wo hängts?!



  • Hallo zusammen.
    Kein Problem liegt vor, nur einer formale Frage:

    Warum geht das hier:

    #include <vector>
    
    class window { 
    
    	// "Prototyp" eines Callbacks für Events eines Fensters jeglicher Art
    	bool (*dummy)(window*,UINT,WPARAM,LPARAM);
    	// Nun den Vektor aus Funktionspointern
    	std::vector< decltype(dummy) > m_vector;
    
    };
    

    ABER das nicht:

    #include <vector>
    
    class window { 
    
    	// Nun den Vektor aus Funktionspointern
    	std::vector< (bool (*dummy)(window*,UINT,WPARAM,LPARAM)) > m_vector;
    
    };
    

    Microsoft Visual Studio 2010 Express meckert bei der ersten runden Klammer: "Error: Es wurde ein Typspezifizierer erwartet"

    Genereller Bug in MSVC oder ein Denkfehler von mir 🙂 ?

    Mit freundlichen Grüßen:
    Johannes Schneider



  • 1. dummy ist ein unbekannter Bezeichner.
    2. Typen dürfne nicht mit () umschlossen werden



  • bool (*dummy)(window*,UINT,WPARAM,LPARAM);
    

    Du hast eine Variable namens dummy, die ein Zeiger auf eine Funktion ist, die bool zurückgibt und die Parameter vom Typ window*, ..., LPARAM entgegennimmt.

    std::vector< (bool (*dummy)(window*,UINT,WPARAM,LPARAM)) > m_vector;
    

    Hier hast du einen vector bestehend aus einer Variable namens dummy, die ... etc.etc.etc.

    Du möchtest keinen Vektor aus Variablen, sondern aus Funktionszeigern. Also lass den Namen weg, dann hast du den reinen Typ:

    std::vector< (bool (*)(window*,UINT,WPARAM,LPARAM)) > m_vector;
    


  • Alles klar!

    Hier der Vollständigkeit halber noch die richtige Version:

    #include <vector>
    
    class window { 
    
    	public:
    
    		// Nun den Vektor aus Funktionspointern
    		std::vector< bool(window*,UINT,WPARAM,LPARAM) > m_vector;
    
    };
    

    Vielen Dank



  • Ist das jetzt nicht ein Vektor basierend auf dem Funktionstyp (nicht Funktionszeiger-Typ?). Willst Du das?



  • std::vector<bool (*)(window*,UINT,WPARAM,LPARAM)> m_vector;
    

    So sollte es gehen. Der Grund ist einfach: Du schreibst ja auch nicht

    std::vector<int i> m_vector;
    

    schöner ist es übrigens so:

    typedef bool (*funcPtr)(window*,UINT,WPARAM,LPARAM);
    std::vector<funcPtr> m_vector;
    


  • Cyres schrieb:

    schöner ist es übrigens so:

    typedef bool (*funcPtr)(window*,UINT,WPARAM,LPARAM);
    std::vector<funcPtr> m_vector;
    

    Und eigentlich gemeint ist vermutlich std::function oder boost::signal .

    typedef std::function<bool (window*,UINT,WPARAM,LPARAM)> funcPtr;
    


  • Was auch geht ist natürlich std::reference_wrapper (der, genau wie std::function , auch einen Konvertierungsoperator und einen operator() bereitstellt):

    std::vector< std::reference_wrapper< bool (window*,UINT,WPARAM,LPARAM) > > m_vector;
    

Anmelden zum Antworten