首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板矩阵模板

模板矩阵模板
EN

Stack Overflow用户
提问于 2017-10-20 08:56:55
回答 1查看 537关注 0票数 0

我试图实现一个简单的矩阵类模板,我想像矩阵一样实例化它(data1,..。,dataN)基本上,我想定义一个模板类,它将2无符号int作为模板参数,并使用初始化列表来推断包含数据的类型--现在我编写了这样一个简单的开始:

代码语言:javascript
复制
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数据;

那你觉得呢?有一种方法可以通过初始化(传递给构造函数的参数)推断矩阵的类型,并在所有类定义中使用这一次?

EN

回答 1

Stack Overflow用户

发布于 2017-10-20 09:11:10

无法将template <typename T>推迟到构造函数。在调用构造函数之前,矩阵需要知道它要存储什么T,否则就不可能计算矩阵对象的大小。所以,您必须像这样声明类:

代码语言:javascript
复制
template <typename T, std::size_t N, std::size_t M>
class Matrix
{
public:
    // Constructors and stuff

private:
    std::valarray<T> data ;  
};

(注:size_t类型在C++中不存在,但存在std::size_t__)

不可能推导出这个T是一件烦人的事情。人们过去常常编写包装器(如std::make_pairstd::make_tuple等),依赖于函数派生其参数类型的能力。

即将推出的c++17标准有您想要的特性,称为类模板参数演绎。它甚至允许一个人指导演绎过程,如下所示:

代码语言:javascript
复制
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,因此您必须更改构造函数签名才能使用此特性。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46845652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档