[solved] generischer datentyp als rückgabewert von operator[] -> syntax?



  • hallo!

    hab grad vor kurzem gesehen wie man 'nen generischen datentypen von 'ner templatefunktion zurückgibt:

    template<class T> T myFunc(std::string& parameter)
    {
    	T t;
    
    	// ...
    
    	return t;
    }
    
    double bar = myFunc<double>( "3.14" );
    

    in anlehnung darauf jetzt meine frage: wie schreib ich sowas wenn sichs bei der funktion um 'nen überladenen []-operator handelt? also:

    template <class T>
    T ConfigReader::operator[]( std::string key )
    {
    	T t;
    
    	//...
    
    	return t;
    }
    

    kann mir diese beiden schreibweisen vorstellen:

    int myInt = reader["someSetting"]<int>;
    int myInt = reader<int>["someSetting"];
    

    hab beide versucht, funzen net... mir is das template-zeugs syntaktisch ohnehin net so geläufig. kann mir dabei wer helfen?



  • iko79 schrieb:

    wie schreib ich sowas wenn sichs bei der funktion um 'nen überladenen []-operator handelt?

    das wird kryptisch ...

    ConfigReader reader;
        // ...
        int myInt = reader.operator[]< int >( "someSetting" );
    

    Gruß
    Werner



  • *argl* das führt den indexer ad absurdum 🙂

    DANKE!!



  • Der Index-Operator kann nur als Memberfunktion einer Klasse definiert werden. Der Typ wird also bereits durch das Objekt bestimmt, auf welches der Index-Operator angewendet wird.

    Z.B. (nur schnell hingeschmiert 🙂 ):

    #include <iostream>
    using namespace std;
    
    template<class T>
    class A {
    public:
    		T& operator[](int);
    		T m_Array[100];
    };
    
    template<class T>
    T&
    A<T>::operator [](int i) {
    	return m_Array[i];
    }
    
    int main()
    {
    	A<int> x;
    
    	for (int i=0; i<100; ++i)
    		x[i] = i;
    
    	for (int i=0; i<100; ++i)
    		cout << i << "|" ;
    
    	cout << endl;
    
    return 0;
    }
    

    Beim Index-Operator auch darauf achten, dass die Rückgabe ein L-Wert sein könnte. Es muss daher eine Referenz zurückgegeben werden.



  • die klasse ist NICHT generisch. nur die eine methode. also der indexer-operator. d.h. i muss den typen explizit angeben.



  • Ups! Ja, da war ich nicht aufmerksam. Man kann es deutlich an deinem Code erkennen. 🙂

    Darf man schüchtern nachfragen, was die Absicht hinter dieser Variante des Index-Operators ist?



  • Hmm ganz einfach ... die Absicht ist klar, doch nicht sonderlich sinnig 😛 Eine einfache Funktion tut es da auch!
    @vic1986: Stell dir mal bsw. vor, du hast eine Klasse, die dir eine *.ini-Datei behandelt. So, dann sollen jetzt die einzelnen Werte ausgelesen werden ... auch kein Problem ... nur sollen die direkt als ein spezieller Typ zurück gegeben werden ...


Log in to reply