Template Problem



  • template <typename T> T GetTypeValue(VARIANT* pVariant)
    {
    	switch(pVariant->vt)
    	{
    		case 2:
    			return pVariant->intVal; break;
    		case 8:
    			return pVariant->dblVal; break;
    		default:
    			break;
    	}
    }
    

    error C2783: 'T __cdecl GetTypeValue(struct tagVARIANT *)' : Vorlagenargument für 'T' konnte nicht hergeleitet werden

    Hat jemand eine Idee wie man das möglichst geschickt machen kann?



  • So wie du dir das vorstellst kannst du Templates leider nicht einsetzen, da zur Compilezeit das Template instanziiert wird und nicht zur Laufzeit. Die Funktion kannst du so nicht realisieren.

    btw. solltest du im default Fall auch etwas zurückgeben oder eine Exception Werfen.



  • Ok, aber gibt es irgendwie eine Möglichkeit, wie man das machen kann?

    switch(pVariant->vt)
        {
            case 2: int value = pVariant->intVal; break;
            case 5: double value = pVaraint->dblVal; break;
        }
    

    Funktioniert auch nicht.



  • Hi!

    Das kann auch nicht funktionieren. Der Compiler muss ja Wissen was er zurückgeben soll, das kann nicht erst in der Funktion entschieden werden, welcher Typ zurückgegeben werden soll.

    Es muss wenigstens ein Parameter vorhanden sein an dem der Compiler den Typ ermitteln kann:

    template<class T> T test(T,T); // Definition irrelevant
    void foo()
    {
      test(1,2); // test<int>(1,2)
      test('a', 'b'); // test<char>('a', 'b')
      // Edit:
      test<int>('a', 1); // test<int>(int('a'), 1)
    }
    

    Du müsstest also beim Aufruf den Typ angeben (wie im letzten Beispiel zu sehen, muss der Typ explizit angegeben werden). Am einfachsten wäre es aber wohl einfach double zurückzugeben.

    Code-Hacker



  • Das einzige was du machen kannst, ist das du dafür z.B. boost::any verwendest.

    Aber das musst du dir dann richtig zurück casten.


Anmelden zum Antworten