Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板的矩阵模板_C++_Templates_Matrix_C++17 - Fatal编程技术网

C++ 模板的矩阵模板

C++ 模板的矩阵模板,c++,templates,matrix,c++17,C++,Templates,Matrix,C++17,我正在尝试实现一个简单的矩阵类模板 我想将其实例化为矩阵(data1,…,dataN) 基本上,我想定义一个以2 unsigned int作为模板参数的模板类,并使用初始化列表推断包含的数据类型,现在我编写了一个简单的开始: template<size_t N, size_t M> class Matrix { public: template<typename ...T> constexpr Matrix<N,M>(T

我正在尝试实现一个简单的矩阵类模板 我想将其实例化为矩阵(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 ;  
};
模板
类矩阵{
公众:
模板
constexpr矩阵(T…args)无例外
:数据{std::forward(args)…}
{
static_assert(sizeof…(args)无法将
模板推迟到构造函数。在调用构造函数之前,矩阵需要知道它将存储什么
T
,否则将无法计算矩阵对象的大小。因此,您必须像这样声明类:

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

private:
    std::valarray<T> data ;  
};
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)>;
不幸的是,在您的情况下,无法派生
N
M
,因此您必须更改构造函数签名才能使用此功能。

无法将
模板推迟到构造函数。在调用构造函数之前,矩阵需要知道它将存储什么
T
ed,否则将无法计算矩阵对象的大小。因此,您必须像下面这样声明类:

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

private:
    std::valarray<T> data ;  
};
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)>;

不幸的是,在您的情况下,无法派生
N
M
,因此您必须更改构造函数签名才能使用此功能。

我不知道是否可以在C++14或更高版本中模板化成员变量,但无论如何,
T
为什么不是整个类的参数?我希望
typename T作为第一个(或最后一个)类的模板参数。因为我会使用矩阵来实例化这些。所以类模板参数应该是…我可以在其中插入T??推断什么?我不知道成员变量是否可以在C++14或更高版本中模板化,但无论如何,
T
为什么不是整个类的参数?我希望
typename T
第一个(或最后一个)类的模板参数。因为我将使用矩阵来实例化这些。所以类模板参数应该是…我可以在其中插入T??推断什么?抱歉,我不明白…以哪种方式?@MarcoGhiani:只需将构造函数设置为非模板化,因为根据lisyarus的建议,您已经将
T
作为类template参数。现在
数据
也将是一个普通成员,而不是模板没有我没有…我有
模板
对不起,我不明白…以哪种方式?@MarcoGhiani:只需将构造函数设为非模板化,因为根据lisyarus的建议,您已经将
t
作为类模板参数。现在还有
数据
将成为正式会员,而不是模板我没有…我有
模板