2017-10-20 176 views
0

我想實現一個簡單的矩陣類模板 我想實例化它像矩陣(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 ;

所以你是什麼想一想 ?有一種方法可以通過初始化(傳遞給構造函數的參數)推導出Matrix 的類型,並沿着所有類定義使用此時間 ?

+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_pairstd::make_tuple等包裝,依靠函數派生它們的參數類型的能力。

即將推出的標準具有您想要的功能,稱爲class template argument deduction。它甚至允許一個引導推導過程,就像這樣:

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'作爲你的類模板參數。也現在'數據'將是一個正規會員,而不是模板 –

+0

不,我沒有...我有'模板' –