我正在寻找一个干净的C++惯用语来处理以下情况:
因此,我真正想要的是让SomeLibraryClass在构建过程结束时强制调用funcToCallAfterAllAddFoos。用户不能将其放在SomeUserClass :: SomeUserClass()的末尾,否则会破坏SomeUserDerrivedClass。如果他将其放在SomeUserDerrivedClass的末尾,则永远不会为SomeUserClass调用它。
为了进一步说明我的需求,请想象/* start initialization */获取锁,并且funcToCallAfterAllAddFoos()释放锁。
编译器知道对象的所有初始化何时完成,但是我能通过某些好的技巧获得这些信息吗?
class SomeLibraryClass {
public:
SomeLibraryClass() { /* start initialization */ }
void addFoo() { /* we are a collection of foos */ }
void funcToCallAfterAllAddFoos() { /* Making sure this is called is the issue */ }
};
class SomeUserClass : public SomeLibraryClass {
public:
SomeUserClass() {
addFoo();
addFoo();
addFoo(); // SomeUserClass has three foos.
}
};
class SomeUserDerrivedClass : public SomeUserClass {
public:
SomeUserDerrivedClass() {
addFoo(); // This one has four foos.
}
};
因此,我真正想要的是让SomeLibraryClass在构建过程结束时强制调用funcToCallAfterAllAddFoos。用户不能将其放在SomeUserClass :: SomeUserClass()的末尾,否则会破坏SomeUserDerrivedClass。如果他将其放在SomeUserDerrivedClass的末尾,则永远不会为SomeUserClass调用它。
为了进一步说明我的需求,请想象/* start initialization */获取锁,并且funcToCallAfterAllAddFoos()释放锁。
编译器知道对象的所有初始化何时完成,但是我能通过某些好的技巧获得这些信息吗?
Foo
)的答案。 - Billy ONealpublic
,所以可能会意外绕过工厂。有什么解决办法吗? - Thomasstatic_cast
回到D
。可以使用模板元编程执行相同的检查,或者直接跳过,因为它不会与int
编译:funcToCallAfterAllAddFoos
不会编译...而且使用该方法名称的类匹配模板要求的层次结构之外的机会很小 :P - David Rodríguez - dribeas