c++ - 模板矩阵模板

标签 c++ templates matrix

我正在尝试实现一个简单的 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 ;

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

最佳答案

没有办法延迟 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_pair 这样的包装器, std::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 ,因此您必须更改构造函数签名才能使用此功能。

关于c++ - 模板矩阵模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46845652/

相关文章:

c++ - 将属性表制作为 MDI 子项

c++ - "The C++ Programming Language"部分错误 "23.4.7 Friends"

tensorflow - 矩阵乘法,但用 min() 之和代替乘积之和

c++ - 在 OpenCV 中实现复值矩阵方程

c++ - 编译器错误说从某物类型的表达式中对某物类型的引用进行了无效初始化*

c++ - 超出窗口的 opengl 菜单是如何实现的?

templates - Jenkins 管道 : templating a file with variables

r - model.matrix 生成的行数比原始 data.frame 少

c++ - 内联 std::inner_product

python - 将 Cython 融合类型转换为 C++ 指针