为什么模板类型定义在 C++(不是 C++11)中是一个问题
Why is template typedef an issue in C++ (not C++11)
在这个问题中,OP要求模板typedef的解决方案,这在C++是不可能的。OP自己也提出了一个解决方案,但不喜欢它:
template<size_t N, size_t M>
class Matrix {
// ....
};
// Problem - will not compile
typedef Matrix<N,1> Vector<N>;
// Solution
template <int N>
class Vector: public Matrix<N,1>
{ };
我的问题是,与OP的解决方案相比,Helper::type
解决方案给我们带来了什么优势(假设这些类永远不会被基指针使用或new
这样使用)?空类在发布中应该没有开销(或者它吗?我能看到的唯一缺点是,在调试版本中,调试时必须扩展基类。
编辑:除了选定的答案外,请参阅@Dani的答案,他建议继承的版本需要定义构造函数,这增加了不便。
typedef
的要点是定义类型别名。子类不是类型别名 - 它是一种新类型。
例如,想象一些库函数
template<size_t N, size_t M>
Matrix<N, M> * createMatrix();
现在使用帮助程序类型
Vector<3>::type * var = createMatrix<3, 1>();
是合法的。
有继承
Vector<3> * var = createMatrix<3, 1>();
莫。
这是因为构造函数不是继承的(在 c++11 中默认不是)。因此,您必须复制所有非默认构造,即使您只是在实现中调用基类构造函数。
除了每个人都喜欢语法(这可能是主观的)之外,主要区别在于,通过固有,向量实际上是另一种衰减成矩阵的类型,而使用包含 typedef 的助手,vector 是矩阵的别名(至少对于部分特化适用的内容)。
差异需要向量来重新定义构造函数(不是继承的),或者在根据模板专用化定义的操作的情况下存在一些潜在的陷阱(使用 typedef,它们永远不会被视为"differnet")
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 发送一个带有libcurl C++问题的帖子请求:s
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 关于复制构造函数的一个棘手问题
- Tmax(0x7fffffff 的一个奇怪问题,为什么 (!x) == x?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 我正在尝试解决一个需要数组总和值但代码不起作用的问题,我想做这样的事情
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 存储另一个函数返回的布尔数组时遇到问题
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 我有一个关于C++提升的问题:: asio 和 std :: 异步
- 这是一个二叉搜索树吗?黑客排名问题
- 几对性能问题(一个较大的向量与较小的块向量),值得存储迭代索引以进行矢量访问
- GLSL问题:一个程序中有多个着色器
- 设计问题——一个函数调用所有三个函数