Rückgabetyp bei template-Funktionen



  • Hallo,

    template <typename T, typename U>
    const Vector<?> operator+(const Vector<T>& lhs, const Vector<U>& rhs)
    

    Wenn jetzt T==int und U==double soll der Rückgabetyp natürlich double sein. Wie könnte man sowas sinnvoll realisieren? Habe mal in den Boost/Loki::TypeTraits nachgesehen und ein wenig in uBlas rumgestöbert, aber bis jetzt noch nichts gefunden (bzw. den Überblick verloren ...). Wäre es eine Möglichkeit, das über Loki::Conversion<T, U>::exists und Loki::Select zu machen?

    Leider liefert der RegressionTest bei Conversion ein Failed, habe mir deswegen jetzt folgendes überlegt:

    // Select == Loki::Select
    	template <bool flag, typename T, typename U>
    	struct Select
    	{
    		typedef T Result;
    	};
    
    	template <typename T, typename U>
    	struct Select<false, T, U>
    	{
    		typedef U Result;
    	};
    
    	template <class T, class U>
    	class Calculation
    	{
    		private:
    			typedef char Small;
    			class Big { char dummy[2]; };
    			static Small Test(T);
    			static Big   Test(U);
    			static T MakeT();
    			static U MakeU();
    		public:
    			enum { isResultT = sizeof(Test(MakeT()+MakeU())) == sizeof(Small)};
    			typedef typename Select<isResultT, T, U>::Result Result;
    	};
    
    	template <class T>
    	class Calculation<T, T>
    	{
    		public:
    			enum { isResultT = true};
    			typedef T Result;
    	};
    

    Welche Nachteile/Probleme würde sowas mit sich bringen? Wenn man es so machen könnte, sollte man für die verschiedenen Rechenarten jeweils einen eigenen Resulttyp zur Verfügung stellen? Also

    enum { isMultResultT = sizeof(Test(MakeT()*MakeU())) == sizeof(Small)};
    enum { isAddResultT = sizeof(Test(MakeT()+MakeU())) == sizeof(Small)};
    

    Oder bin ich gerade nur zu verpeilt und übersehe eine (für euch) offensichtliche Lösung?!?

    Danke!



  • hmm, was besseres fällt mir gerade auch nicht ein.



  • Alternativ könntest Du auch nur Vector des gleichen Typs bei der Addition zulassen und einen template Copy-Ctor anbieten für die Konvertierung anbieten.
    Das ist halt möglicherweise ein bißchen teurer, dafür aber einfach zu implementieren und recht flexibel.

    MfG Jester



  • Okay, danke schonmal!

    Ein Template-Copy-Ctor ist eine gute Idee, allerdings würde ich auch gerne so etwas zulassen:

    Vector<int> v(4);
    ...
    Vector<double> w(4);
    ...
    cout << 2.3*v+w << endl;
    //oder
    cout << scalarProduct<v, w> << endl;
    

    Über weitere gute Ideen/Vorschläge würde ich mich freuen 🙂



  • ersteres sollte doch bereits funktionieren, oder? wir matchen double, Vector<double>, also wird Vector<int> konvertiert in Vector<double> und das ganze läuft. Was Du mit letzterem Beispiel erreichen willst ist mir nicht ganz klar. v,w sind Vektoren und damit nicht als template-Parameter geeignet.

    MfG Jester



  • Hups, da habe ich mich vertan. Bin es gewohnt das Skalarprodukt in eckige Klammern zu schreiben. Gemeint war natürlich sclalarProduct(v, w). Aber das müßte dann ja auch funktionieren. Werde es mal testen ...


Anmelden zum Antworten