2016-11-19 6 views
0

私は行列を扱えるプログラムを作成しようとしている学校プロジェクトがあります。これまでは、行列を生成して基本的な操作を行うことができる、目的外のコードを持っていました。しかし、最初はデータ型を定義しなければなりません。データ型は行列に保存されます。だから、先生はテンプレートを使って多才なことをお勧めします。C++のテンプレート - データ型に関する推測されたポインタからのデータの作成方法

可変データ型が必要な場所は2つあります。

1)行列を定義する構造体 - 行列単一要素のデータ型へのポインタへのポインタ。 (TTypeが定義されています)

struct TMatrix 
    { 
    TType **iData; 
    unsigned iY, iX; 
    }; 

2)個々の機能、たとえば単一の要素を扱うことができる機能。

 TType &At(TMatrix &aMat, const unsigned prvek_x, const unsigned prvek_y) 
     { 
     return (TType(aMat.iData[prvek_x][prvek_y]); 
     } 

まず、1)テンプレート構造を生成する際のテンプレートの使い方は?私はこのTMatrix<double> amat = { nullptr, 0, 0 };

第二の事のようにそれを呼び出すようにしたい場合は、それはguesedポインタから基本的なデータ型を取得することが可能であるので、私はこの

 template <typename T> 
     T &At(TMatrix &aMat, const unsigned prvek_x, const unsigned prvek_y) 

のような)2で何かを使用している場合はどのように私はdoubleからを得ることができます代わりにTTypeを代用するT

これで私を助けてもらえますか?

+0

あなたはタイプを推測するために 'decltype(TMatrix ::のiDataを)'を使用することができます。 –

+0

あなた2)が間違っています。最初のパラメータの型は 'TMatrix'だけでなく' TMatrix 'でなければなりません。 –

答えて

2

あなたがテンプレートを使用して、両方のことを行うことができます:テンプレートで指定されTMatrix<T>中と戻り値の型でTが同じであるため、

template <typename T> 
struct TMatrix 
{ 
    T **iData; 
    unsigned iY, iX; 
}; 

template <typename T> 
T &At(TMatrix<T> &aMat, const unsigned prvek_x, const unsigned prvek_y) 
{ 
    return aMat.iData[prvek_x][prvek_y]; 
} 

At機能で明示的にTTypeは必要ありません。

あなたはこのmainでこのコードをテストすることができます。

#include <iostream> 

int main(void) 
{ 

    TMatrix<double> amat = {nullptr, 0, 0}; 

    amat.iData = new double*[1]; 
    amat.iData[0] = new double[1]; 

    amat.iData[0][0] = 1; 

    std::cout << At(amat, 0, 0) << std::endl; 
    At(amat, 0, 0) = 5; 
    std::cout << At(amat, 0, 0) << std::endl; 

    delete[] amat.iData[0]; 
    delete[] amat.iData; 

    return 0; 
} 
+0

ありがとう、それは多くを助ける。 – Harak

関連する問題