模板的矩阵模板
我想实现一个简单的矩阵类模板 我想实例化它像矩阵(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 ;
所以你是什么想一想 ?有一种方法可以通过初始化(传递给构造函数的参数)推导出Matrix 的类型,并沿着所有类定义使用此时间 ?
有没有办法推迟template <typename 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
等包装,依靠函数派生它们的参数类型的能力。
即将推出的c++17标准具有您想要的功能,称为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)>;
可惜的是,你的情况是不可能获得N
和M
,所以你必须为了使用该功能来改变构造函数签名。
抱歉,我不明白...在哪种方式? –
@MarcoGhiani:只是让构造函数非模板化,因为通过lisyarus建议你已经有'T'作为你的类模板参数。也现在'数据'将是一个正规会员,而不是模板 –
不,我没有...我有'模板
我不知道成员变量是否可以在C++ 14或更高版本中模板化,但无论如何,为什么'T'不是整个类的参数? – user463035818
我期望'typename T'是类的第一个(或最后一个)模板参数。 – grek40
,因为我会用矩阵实例化这些..所以类模板参数应该是 ...我可以在其中插入T?推断什么? –