一个类是如何从一个专门针对它自己的模板派生出来的
How is it possible for a class to be derived from a template specialized on itself?
我真的不知道如何描述它,但这是代码:
class A : public std::vector<A>
{
};
//....
A a;
a.push_back(a);
它做什么?你为什么要这样做?
这是奇怪的重复模板模式(CRTP)
它允许您实现静态多态性。
但是,使用std::vector
作为基类是一种糟糕的做法,因为它没有虚拟析构函数。
由于它是A
s的向量,而不是A*
s的向量,因此a
本身不能包含它自己。但是push_back
将在调用时向向量中添加a
的副本。
示例:
#include <vector>
#include <iostream>
using namespace std;
class A : public std::vector<A>
{
public:
void print(int level=0){
for (int i=0;i<level;i++) cout<<" ";
cout << "0x" << hex << (unsigned int)this << "=[";
if (size()){
cout << endl;
for (int i=0; i<size(); i++)
(*this)[i].print(level+1);
for (int i=0;i<level;i++) cout<<" ";
}
cout <<"]"<<endl;
if(!level) cout << endl;
}
};
int main(){
A a;
for (int i=1;i<=3;i++){
a.push_back(a);
a.print();
}
return 0;
}
输出:
0xbff4fa20=[
0x9ec2008=[]
]
0xbff4fa20=[
0x9ec2018=[]
0x9ec2024=[
0x9ec2038=[]
]
]
0xbff4fa20=[
0x9ec2048=[]
0x9ec2054=[
0x9ec20a0=[]
]
0x9ec2060=[
0x9ec2080=[]
0x9ec208c=[
0x9ec2008=[]
]
]
]
子类用于终止泛型。矢量只能包含A
类型的对象,而不能包含任意矢量。
现在,我不知道你为什么要构建一个包含自己的对象。但这样做是有原因的。例如,对于单元测试,为了确保算法能够处理包含循环的集合。一个天真的算法可能会运行到一个无限循环中,从而使单元测试失败。
相关文章:
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- C :基类调用自己的虚拟函数 - 一个反图案
- 如何将另一个项目中用 C 编写的源代码包含在我自己的项目中,C++在 Visual Studio 中
- 我创建了自己的智能指针类,我用这个智能指针指向一个类实例,如何正确返回智能指针
- 将一个常量cstring附加到我自己的String类对象
- Cmake-让一个子目录使用自己的makefile
- 我想捕获一个异常,并将其绑定到我自己的异常中,然后向上抛出
- CMakeLists.txt有两个子项目和自己的CMakeLists.txt只需要创建一个.so库,该库包含所有子项目
- 同一个c++类的所有实例共享一个vtable,或者每个实例都有自己的vtable
- 用我自己的例外编写一个包装器
- 一个类不能有自己的静态 constexpr 成员实例吗?
- C++:一个类可以有它自己的类型的对象吗?
- 在自己的.cpp中定义一个结构,然后在main中使用它
- 如果你的基类有一个虚拟析构函数,你自己的析构函数就会自动变成虚拟的
- 如何创建一个只能由自己的类调用的构造函数
- 让一个类完全在自己的线程上运行
- 声明一个以我自己的类作为值类型的映射
- 一个类是如何从一个专门针对它自己的模板派生出来的
- 为什么我们需要写一个自己的复制程序,而我们可以使用复制shell命令