Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归模板:继承与组合 我的C++技能有点生疏,可以追溯到C++ 99,所以我决定花些时间练习更多的元程序设计。_C++_Templates_Metaprogramming - Fatal编程技术网

递归模板:继承与组合 我的C++技能有点生疏,可以追溯到C++ 99,所以我决定花些时间练习更多的元程序设计。

递归模板:继承与组合 我的C++技能有点生疏,可以追溯到C++ 99,所以我决定花些时间练习更多的元程序设计。,c++,templates,metaprogramming,C++,Templates,Metaprogramming,我试图使用递归模板来实现一个向量类。 我找到两种方法: 使用继承:在这种情况下,维度N的向量继承自维度N-1的向量。请参见下面的#1示例代码 使用合成:在这种情况下,维度N的向量由值和维度N-1的向量组成。请参见下面的#2示例代码 P>关于C++中的元编程,在做一个或另一个方面有什么好处吗?如果我走这条路或那条路,会有一些陷阱吗?或者在这两种情况下,编译器能够完成几乎相同的工作吗 // // Sample code 1 -- Using inheritance // template<u

我试图使用递归模板来实现一个向量类。 我找到两种方法:

  • 使用继承:在这种情况下,维度N的向量继承自维度N-1的向量。请参见下面的#1示例代码
  • 使用合成:在这种情况下,维度N的向量由值和维度N-1的向量组成。请参见下面的#2示例代码
  • <> P>关于C++中的元编程,在做一个或另一个方面有什么好处吗?如果我走这条路或那条路,会有一些陷阱吗?或者在这两种情况下,编译器能够完成几乎相同的工作吗

    //
    // Sample code 1 -- Using inheritance
    //
    template<unsigned int DIM>
    class VectorND : VectorND<DIM-1> {
        private:
        double _n;
    
        public:
        template<class N, class... Rest>
        VectorND(N n, Rest... rest): _n(n), VectorND<DIM-1>(rest...) {};
    };
    
    template<>
    class VectorND<0> {
    
    };
    
    int main() {
        VectorND<3> v(1,2,3);
    
    }
    
    //
    //示例代码1——使用继承
    //
    模板
    类VectorND:VectorND{
    私人:
    双倍;;
    公众:
    模板
    向量(N,Rest…Rest):\N(N),向量(Rest…{};
    };
    模板
    类向量{
    };
    int main(){
    向量v(1,2,3);
    }
    

    //
    //示例代码2——使用组合
    //
    模板
    类向量{
    私人:
    矢量基;
    双倍;;
    公众:
    模板
    向量(N,Rest…Rest):\N(N),\u基(Rest…{};
    };
    模板
    类向量{
    };
    int main(){
    向量v(1,2,3);
    }
    
    依赖名称通常在继承方面更令人惊讶。顺便说一句,
    std::array
    完成了这项工作(成员类似于
    double data[N];
    )。@Jarod42我觉得这也会更简单(可能会更快编译,因为实例化更少?),代码似乎比使用组合时更冗长。关于
    std::array
    ——确实如此,但这主要是我练习“现代”模板的借口;)@Borgleader:对于Meta prog,“复杂性”实际上是实例化的数量。
    //
    // Sample code 2 -- Using composition
    //
    template<unsigned int DIM>
    class VectorND {
        private:
        VectorND<DIM-1> _base;
        double _n;
    
        public:
        template<class N, class... Rest>
        VectorND(N n, Rest... rest): _n(n), _base(rest...) {};
    };
    
    template<>
    class VectorND<0> {
    
    };
    
    int main() {
        VectorND<3> v(1,2,3);
    
    }