c++ - 递归模板:继承与组合
问题描述
我的 C++ 技能有点生疏,可以追溯到 C++99,所以我决定花一些时间练习更高级的元编程。
我正在尝试使用递归模板来实现 Vector 类。我找到了两种方法:
- 使用继承:在这种情况下,维度为 N 的向量继承自维度为 N-1 的向量。请参阅下面的 #1 示例代码。
- 使用组合:在这种情况下,维度为 N 的向量由一个值和维度为 N-1 的向量组成。请参阅下面的#2 示例代码。
就 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);
}
//
// 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);
}
解决方案
推荐阅读
- html - 努力将容器宽度更改为 % 而不是 px
- url - 新手:IIS URL 重写
- c# - OWIN Startup 类与 WebAPIConfig.Register 方法一起执行
- c - 如何在C中查找字符数组中出现的次数?
- mysql - 原因:在 MySQL 5.7 中带有 DELETE 语句的 liquibase.exception.DatabaseException
- c++ - 使用 Clang-6.0 无法在 Travis 上编译 C++17 代码
- php - PHP搜索查询与CONCAT完全匹配
- c# - 验证方法和返回值 - 异常 vs 模型状态 vs Bool
- python - 写入二进制文件时的 file.seek() 和 file.write() 问题
- java - 删除字符串中的偶数对字符从字符串中重复出现字符 - java