2017-10-20 4 views
0

私は単純なMatrixクラステンプレートを実装しようとしています Matrix(data1、..、dataN)のようにインスタンス化したいと思います 基本的には2のunsigned intテンプレートの行列テンプレート

template<size_t N, size_t M> 
class Matrix { 

    public: 

    template<typename ...T> 
     constexpr Matrix<N,M>(T ... args) noexcept 
      : data{std::forward<T>(args)... } 
      { 
       static_assert(sizeof...(args) <= N*M, "Insufficent element for a Matrix "); 

      } 

    const auto getData()const { return data; } 


    private: 

    template<typename T> 
    std::valarray<T> data ; 
}; 

が、私はエラーを得た。..

error: data member ‘data’ cannot be a member template std::valarray data ;

は、あなたが何をすべきか:テンプレートパラメータ、および今、私はこの単純なスタートを書い含むデータの種類を推定する初期化リストを使用するなど、について考える ?彼女の初期化(コンストラクタに渡されるパラメータ)によって行列 の型を推測し、この時間をすべてのクラス定義に沿って を使用する方法がありますか?

+2

メンバ変数がC++ 14以降でテンプレート化できるかどうかわかりませんが、どうして 'T'はクラス全体のパラメータではないのですか? – user463035818

+0

'typename T'がクラスの最初の(または最後の)テンプレート引数になると思います。 – grek40

+0

私はこれらのインスタンス化のためにを使用するので、クラステンプレートパラメータはにする必要があります。どこにT ??を挿入できますか?何を推測する? –

答えて

4

template <typename T>をコンストラクタに転送する方法はありません。行列はコンストラクタが呼び出される前に何を格納するのかを知る必要があります。そうしないと、行列オブジェクトのサイズを計算することができなくなります。だから、あなたはこのようにクラスを宣言する必要があります:

template <typename T, std::size_t N, std::size_t M> 
class Matrix 
{ 
public: 
    // Constructors and stuff 

private: 
    std::valarray<T> data ; 
}; 

(注意:C++にはsize_tタイプが存在しませんが、std::size_tがある)

このTを推定する非可能性迷惑なことです。人々は、引数の型を派生させる関数の能力に依存して、std::make_pair,std::make_tupleのようなラッパーを書いていました。

今後の標準には、class template argument deductionと呼ばれる機能があります。それも、1はこのように、控除プロセスをガイドすることができます:

template <typename T, std::size_t N> 
struct array 
{ 
    T data[N]; 

    template <typename ... X> 
    array (X ... x) 
     : data{x...} 
    { } 
}; 

template <typename ... X> 
array(X ...) -> array<std::common_type_t<X...>, sizeof...(X)>; 

生憎、あなたのケースでは、NMを導出することは不可能であるので、あなたは、この機能を使用するためには、コンストラクタの署名を変更する必要があります。

+0

申し訳ありません私は理解していません...どのように? –

+1

@MarcoGhiani:lisyarusの提案ではクラステンプレートパラメータとして 'T'を既に持っているので、コンストラクタをテンプレート化しないでください。また、 'data'はテンプレート化されていない普通のメンバになります –

+0

私は' template 'を持っています –

関連する問題