【问题标题】:Matrix template of template模板的矩阵模板
【发布时间】:2017-10-20 08:56:55
【问题描述】:

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

但我有一个错误..

错误:数据成员“数据”不能是成员模板 std::valarray 数据;

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

【问题讨论】:

  • 我不知道成员变量是否可以在 C++14 或更高版本中进行模板化,但无论如何为什么T 不是整个类的参数?
  • 我希望typename T 是该类的第一个(或最后一个)模板参数。
  • 因为我会使用 Matrix 来实例化这些 .. 所以类模板参数应该是 ... 我可以在哪里插入 T ??推断什么?

标签: c++ templates matrix


【解决方案1】:

没有办法推迟 template &lt;typename T&gt; 给构造函数。在调用构造函数之前,矩阵需要知道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,因此您必须更改构造函数签名才能使用此功能。

【讨论】:

  • 对不起,我不明白...以哪种方式?
  • @MarcoGhiani:只需将构造函数设为非模板化,因为根据 lisyarus 的建议,您已经将 T 作为类模板参数。现在data 也将成为普通成员,而不是模板化
  • 不,我没有...我有template&lt;std::size_t N, std::size_t M &gt;
猜你喜欢
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多