How to override static method of template class in derived class
我对重写基本类的静态方法有点问题,但整个问题非常复杂且太长(游戏引擎中的资源管理泛化),因此这里有一个简化的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | template<class T> class base { static void bar() { printf("bar"); } public: static void foo() { bar(); } }; class derived : public base<int> { static void bar() { printf("baz"); } }; int main() { derived::foo(); } |
上面的代码输出"bar",在我的例子中,我希望它输出"baz"。我该怎么办?似乎不管我尝试什么,base::foo()总是调用base::bar()。我可能对设计有意见。我从来没有遇到过这个问题-我如何解决它?
您要做的是不能用简单的类继承实现;方法不能同时是
你需要一个
这两个特点是相互排斥的。但奇怪的递归模板模式(crtp)可能是这里的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <iostream> template<class T> struct base { static void foo() { T::bar(); } }; struct derived : public base<derived> { static void bar() { std::cout <<"derived" << std::endl; } }; int main() { derived::foo(); } |
活生生的例子