我一直在使用奇怪的重复模板模式一般代码如下所示:
template <typename T> void genericFunction(T &);
template <typename T> struct Functionality {
void genericMethod() {
genericFunction(*((T *)this)) ;
}
};
struct Klass : public Functionality<Klass> {};
void main() {
Klass obj ;
obj.genericMethod();
}
template <> void genericFunction<Klass>(Klass &obj) {
//do stuff with Klass &obj here
}
Run Code Online (Sandbox Code Playgroud)
我今天遇到了一个错误,这花了我大约90分钟的拔毛,这个错误是由于我的基类继承声明使用了一个不正确的模板参数引起的,有点像这样:
struct Klass : public Functionality<SomeOtherKlass> {}; //SomeOtherKlass wrong!!!
Run Code Online (Sandbox Code Playgroud)
我想增强我的代码,以便检测派生类和基类模板参数之间的这种不匹配(运行时,编译时,任何时候:)),这甚至可能吗?,谢谢.
以下代码抛出std :: bad_cast
struct Foo {
void foo () {}
};
struct Bar {
Bar () {
dynamic_cast <Foo &> (*this) .foo ();
}
virtual ~ Bar () {}
};
struct Baz : public Foo, public Bar {
};
int main ()
{
Baz b;
}
Run Code Online (Sandbox Code Playgroud)
我记得曾经读过dynamic_cast如何进行实现性能权衡,因为"它遍历了完整的继承格"以便正确评估.编译器在这里需要做的是先强制然后再次向下.
可以进行上述工作还是需要添加
virtual Foo* Bar::as_foo()=0;
?