我正在研究Stroustroup的书"C++编程第4版".而我正试图在矩阵设计上遵循他的例子.
他的矩阵类很大程度上依赖于模板,我尽力把它们搞清楚.这是此矩阵的辅助类之一
Matrix_slice是Matrix实现的一部分,它将一组下标映射到元素的位置.它使用了广义切片的思想(§40.5.6):
templatestruct Matrix_slice { Matrix_slice() = default; // an empty matrix: no elements Matrix_slice(size_t s, initializer_list exts); // extents Matrix_slice(size_t s, initializer_list exts, initializer_list strs);// extents and strides template // N extents Matrix_slice(Dims... dims); template ()...)>> size_t operator()(Dims... dims) const; // calculate index from a set of subscripts size_t size; // total number of elements size_t start; // star ting offset array extents; // number of elements in each dimension array strides; // offsets between elements in each dimension }; I
以下是构建我的问题主题的线条:
template()...)>> size_t operator()(Dims... dims) const; // calculate index from a set of subscripts
在本书的前面,他描述了如何实现Enable_if和All():
templateusing Enable_if = typename std::enable_if::type; constexpr bool All(){ return true; } template constexpr bool All(bool b, Args... args) { return b && All(args...); }
我有足够的信息来了解它们是如何工作的,通过查看他的Enable_if实现,我也可以推断出Convertible函数:
templatebool Convertible(){ //I think that it looks like that, but I haven't found //this one in the book, so I might be wrong return std::is_convertible ::value; }
所以,我可以解释这个模板函数声明的构建块,但是当我试图理解它们如何工作altogather时我很困惑.我希望你能提供帮助
template()...)>> //Evaluating and expanding from inside out my guess will be //for example if Dims = 1,2,3,4,5 //Convertible ()... = Convertible<1,2,3,4,5,size_t>() = //= Convertible (),Convertible (),Convertible (),... //= true,true,true,true,true //All() is thus expanded to All(true,true,true,true,true) //=true; //Enable_if //here is point of confusion. Enable_if takes two tamplate arguments, //Enable_if //but here it only takes bool //typename = Enable_if(...) this one is also confusing size_t operator()(Dims... dims) const; // calculate index from a set of subscripts
那么到底我们得到了什么?这个结构
template> size_t operator()(Dims... dims) const;
问题是:
我们不需要Enable_if的第二个模板参数
为什么我们为typename赋值('=')
我们到底得到了什么?
更新: 您可以查看我在这里引用的同一本书中的代码 C++编程语言第4版第841页(矩阵设计)