美文网首页程序员
《effective c++阅读笔记》条款44:将与参数无关的代

《effective c++阅读笔记》条款44:将与参数无关的代

作者: JimmyPan | 来源:发表于2020-05-02 04:57 被阅读0次
    template <typename T, size_t n>
    class SquareMatrix
    {
    public:
        void Invert();
    };
    
    int main()
    {
        SquareMatrix<int, 10> a;
        SquareMatrix<int, 5> b;
    }
    

    在这个例子中,因为调用了使用了int,10和int,5为模版参数的SquareMatrix,所以会导致模版实例化出两个版本的invert
    但此时invert只和10,5也就是矩阵size有关,和type无关。所以就像解决其他重复代码一样,把重复无关的部分提取出来成一个单独的class或者和函数。对应题目 《将与参数无关(type无关)的代码抽离templates》

    所以提取后改造成以下

    template <typename T>
    class SquareMatrixBase
    {
    public:
        void Invert(size_t size);
    };
    
    template <typename T, size_t n>
    class SquareMatrix:private SquareMatrixBase<T>
    {
    public:
        using SquareMatrixBase::invert(size_t);
        void Invert(){
        this->invert(n);   
    private:
         T data[n*n];
    }
    };
    

    这样改造之后
    SquareMatrix<int, 10> a;
    SquareMatrix<int, 5> b;
    都共享同一个SquareMatrixBase<int>

    然而这样做也是有着代价的
    代价1.无法进行常量的编译优化
    size是个编译期的常量,可以藉由常量的广传达到最优化

    相关文章

      网友评论

        本文标题:《effective c++阅读笔记》条款44:将与参数无关的代

        本文链接:https://www.haomeiwen.com/subject/cijhghtx.html