模板的矩阵模板

问题描述:

我想实现一个简单的矩阵类模板 我想实例化它像矩阵(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?推断什么? –

有没有办法推迟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

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