我正在使用CRTP。在代码中它看起来像这样:
template<class T>
class Base{
//...
};
class Derived : public Base<Derived>{
//...
};
复制/粘贴错误开始出现:
class Foo : public Base<Foo>{
//...
};
class Bar : public Base<Foo>{ //Ой
//...
};
我决定写一个断言来检查这个案例。
想出了这个选项:
template<class T>
class Base{
protected:
typedef T TemplateType;
typedef Base<T> BaseType;
//...
};
class Derived : public Base<Derived>{
public:
Derived(){
Q_ASSERT(typeid(*this) == typeid(Base::TemplateType));
}
//...
};
但是他有点丑。在运行时工作,需要一些模糊的 typedef。
我在这里。如何使用 C++03 和 Qt 编写这样的断言?因此,同时也不羞于向人们展示。
这个选项:
很明显,您可以
IsDerivedFrom<D,Base<D> >::Is
在编译时直接使用它。满足 C++03 条件 - Open Watcom 成功完成编译。
更新决定 2。不会让您从另一个编译后继者
Base<>
,复制粘贴会起作用 - 当前类的名称不在其中 :)。唉,typedef
还是需要一个。更新 2立即尝试: