模板的矩阵模板

Matrix template of template

本文关键字:      更新时间:2023-10-16

我正在尝试实现一个简单的矩阵类模板我想像矩阵一样实例化它(data1 , .. , dataN)基本上我想定义一个模板类,它将 2 个无符号 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 ;  
};

但是我得到了一个错误..

错误:数据成员"数据"不能是成员模板 std::valarray data ;

那你怎么看? 有一种方法可以推断矩阵的类型通过她的初始化(传递给构造函数的参数)并使用此时间沿着所有类定义 ?

无法template <typename T>推迟到构造函数。在调用构造函数之前,矩阵需要知道它将存储什么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等包装器,依靠函数的能力来推导他们的参数类型。

即将推出的 c++17 标准具有您想要的功能,称为类模板参数推导。它甚至允许人们指导扣除过程,如下所示:

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,因此您必须更改构造函数签名才能使用此功能。

相关文章:
  • 没有找到相关文章