- 论坛徽章:
- 1
|
10可用积分
某些工业控制程序设计的需求是,创建对象的顺序需要依赖一定的规则。
通常我们很容易通过运行时的检查来保证这一规则。但是在程序运行时检查到顺序不对的时候,可能程序已经无法从错误状态恢复了,或者因为操作硬件的原因,运行时检查出错已经晚了。所以非常希望能借助C++强大模板机制来保证"创建顺序"。能做到吗?
例如,我有一个虚基类和若干个子类:
- struct IBase{virtual void f()=0;};//虚基类,定义f函数
复制代码 若干个子类,例如以A开头的子类,以B开头的子类,以C开头的子类:
- struct A1:IBase{void f(){}}
- struct A2:IBase{void f(){}}
- struct A3:IBase{void f(){}}
- struct B1:IBase{void f(){}}
- struct B2:IBase{void f(){}}
- struct C1:IBase{void f(){}}
- struct C2:IBase{void f(){}}
- struct C3:IBase{void f(){}}
复制代码 然后在main函数当中,我希望,我总是先创建若干个A1/A2/A3类型的对象,然后再创建B1/B2类型的对象,最后再创建C1,C2,C3类型的对象,可以重复。
例如:
A3,A1,A2,B2,B2,C1,C3,C2,C1这个顺序是OK的
但是
B3,A2,B1,C1就不行。因为B类型的对象创建在A类型之前了。
那么如果我有一个main函数如下:
- int main()
- {
- vector<IBase*> v;
- v.push_back(new B3);
- v.push_back(new A2);//这一行要有编译错误
- v.push_back(new B1);
- v.push_back(new C1);
- return 0;
- }
复制代码 我希望程序被编译的时候,编译器能在main函数的第二行监测到错误,也就是因为我已经插入了一个B3类型的对象了,我就只能插入B类型的,或者C类型的对象,不能再插入A类型的对象了。
用模板的能力,或者模板元编程的能力,能做到吗?
|
最佳答案
查看完整内容
回复 10# sentto2 保证对象的创建顺序是ABI的事,ABI这一部分不在标准中。标准只会说实现“应该”让某些事发生在另一些事“之前”
|