wie weit sollte generizität gehen?



  • einfaches beispiel aus meiner mathelib

    // ganz normaler vektor
    template<
    	typename _T> class Vector4
    {
    	public:
    		Vector4() { /* .. */ }
    
    	private:
    		_T	val[4];
    };
    
    // bounding box oder im volksmund quader
    // erste möglichkeit
    template<
        typename _T> class AABB
    {
    	public:
    		AABB(const Vector4<_T> &vMin, const Vector4<_T> &vMax)
    		:	m_vMin(vMin),
    			m_vMax(vMax)
    		{ }
    
    	private:
    		Vector4<_T>	m_vMin, m_vMax;
    };
    // oder möglichkeit zwei
    template<
        typename _T> class AABB
    {
    	public:
    		AABB(const _T &vMin, const _T &vMax)
    		:	m_vMin(vMin),
    			m_vMax(vMax)
    		{ }
    
    	private:
    	    _T		m_vMin, m_vMax;
    };
    

    nun stellt sich für mich die frage was "besser" oder geschickter ist.
    natürlich gebe ich dem user die möglichkeit bei der zweiten variante
    seine eigene vektorklasse zu benutzen dieses setzt natürlich voraus
    das diese auch die entsprechenden methoden bzw. operatoren besitzt bzw.
    überlädt. sicherer wäre natürlich variante eins da ich ja weis was
    meine eigene vektorklasse kann und macht. klarer nachteil von variante
    zwei, finde ich, ist das wenn ich dieses konsequent durchziehen würde
    jedes member von allen klassen generisch machen müsste, was natürlich
    bei einigen klassen mit vielen unterschiedlichen member erheblicher
    aufwand ist.



  • Was, wenn Du in deiner Mathelib mehr als nur Multiplizieren oder Addieren mit Vektoren machen willst? Das kann bei dem Nutzer ja ganz anders aussehen. Dann plötzlich wieder eine Schnittstelle voraussetzen? Naja, das ginge schon, wenn der Nutzer irgentwelche optimieren, plattformabhängigen Libs nutzen will, müsste er sich halt nen Wrapper schreiben. Keine Ahnung, ob das die Mühe wert ist. Ich würd's nicht machen. 😃



  • Wie wär's mit

    template
    <
      typename T_,
      template <class> class VectorT = Vector4
    >
    class AABB
    {
        public:
            AABB(const VectorT<T_> &vMin, const VectorT<T_> &vMax)
            :    m_vMin(vMin),
                m_vMax(vMax)
            { }
    
        private:
            VectorT<T_>        m_vMin, m_vMax;
    };
    

    Das _T solltest du in T_ ändern da T ein Großbuchstabe ist - schau mal in die FAQ, da steht bestimmt auch irgendwo was über reservierte Bezeichner.



  • template template parameter daran hatte ich nicht gedacht. dank dir


Anmelden zum Antworten