当前位置:  开发笔记 > 编程语言 > 正文

需要帮助来理解具有复杂typename参数的模板函数

如何解决《需要帮助来理解具有复杂typename参数的模板函数》经验,为你挑选了0个好方法。

我正在研究Stroustroup的书"C++编程第4版".而我正试图在矩阵设计上遵循他的例子.

他的矩阵类很大程度上依赖于模板,我尽力把它们搞清楚.这是此矩阵的辅助类之一

Matrix_slice是Matrix实现的一部分,它将一组下标映射到元素的位置.它使用了广义切片的思想(§40.5.6):

template
struct 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():

template
using 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函数:

template
bool 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页(矩阵设计)

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有