templates



  • erstmal mein code

    template<int n,int m=n>
    class matrix
    {
     public:
     float Dat[n][m];
    
     // Konstruktoren
     //---------------------------------------------------------------------------
     matrix()
    	{
    		if(n==m)
    		for(int i=0;i<n;i++)
    			for(int t=0;t<m;t++)
    				{
    					if(i==t)
    						Dat[i][t]=1;
    					else
    						Dat[i][t]=0;
    				}
    	}
     //---------------------------------------------------------------------------
     //Debug Methoden
     #ifdef DEBUG
     //---------------------------------------------------------------------------
     void show()
    	{
    	for(int i=0;i<n;i++)
    	{
    	for(int t=0;t<m;t++)
    		{
    		std::cout<<Dat[i][t]<<"\t";
    		}
    		std::cout<<std::endl;
    		}
    
    	}
     //---------------------------------------------------------------------------
     #endif
    
     //Operatoren
     //---------------------------------------------------------------------------
     matrix operator +(const matrix<n,m> &op)
    	{
    	matrix<n,m> erg;
    	for(int i=0;i<n;i++)
    		for(int t=0;t<m;t++)
    			{
    			erg.Dat[i][t]= this->Dat[i][t] + op.Dat[i][t];
    			}
    	return erg;
    	}
     //---------------------------------------------------------------------------
     matrix operator -(const matrix<n,m> &op)
    	{
    	matrix<n,m> erg;
    	for(int i=0;i<n;i++)
    		for(int t=0;t<m;t++)
    			{
    			erg.Dat[i][t]= this->Dat[i][t] - op.Dat[i][t];
    			}
    	return erg;
    	}
     //---------------------------------------------------------------------------
     matrix operator +(const float &op)
    	{
    	matrix<n,m> erg;
    	for(int i=0;i<n;i++)
    		for(int t=0;t<m;t++)
    			{
    			erg.Dat[i][t]=Dat[i][t] + op;
    			}
    	return erg;
    	}
     //---------------------------------------------------------------------------
     matrix operator -(const float &op)
    	{
    	matrix<n,m> erg;
    	for(int i=0;i<n;i++)
    		for(int t=0;t<m;t++)
    			{
    			erg.Dat[i][t]=Dat[i][t] - op;
    			}
    	return erg;
    	}
     //---------------------------------------------------------------------------
     matrix operator *(const float &op)
    	{
    	matrix<n,m> erg;
    	for(int i=0;i<n;i++)
    		for(int t=0;t<m;t++)
    			{
    			erg.Dat[i][t]=Dat[i][t] * op;
    			}
    	return erg;
    	}
     //---------------------------------------------------------------------------
     matrix operator /(const float &op)
    	{
    	matrix<n,m> erg;
    	for(int i=0;i<n;i++)
    		for(int t=0;t<m;t++)
    			{
    			erg.Dat[i][t]=Dat[i][t] / op;
    			}
    	return erg;
    	}
     //---------------------------------------------------------------------------
     matrix operator *(const matrix<,n> &op)
    	{
    
    	}
    };
    

    Mein Problem ist der Operator am Schluss
    die Funktion soll 2 matrizen miteinander multiplizieren.
    bekannterweise muss dazu matrix2 so viele Spalten haben wie matrix1 zeilen
    n sind die zeilen und m die spalten in meinem template
    da aber n von matrix 2 irrelevant ist müsse ich es irgendwie hinbekommen als Parameter der Funktion eine Matrix mit beliebigem n anzugeben allerdings m als n von matrix1. Wie kann ich das in C++ schreiben.
    Ich hoffe das war halbwegsverständlich.



  • So sollte es gehen:

    template< int n, int m=n >
    class matrix
    {
    public:
        template< int k >
        matrix< n, k > operator*( const matrix< m, k >& b )
        {
            matrix< n, k > erg;
            // erg berechnen
            return erg;
        }
    private:
        float m_dat[n][m];
    };
    
    int main()
    {
        matrix< 2, 3 > m23;
        matrix< 3, 7 > m37;
        matrix< 2, 7 > m27 = m23 * m37;
        return 0;
    }
    

    Gruß
    Werner



  • ja scheint zu gehe

    thx


Anmelden zum Antworten