当前位置:  开发笔记 > 编程语言 > 正文

如何在派生类中重写模板类的静态方法

如何解决《如何在派生类中重写模板类的静态方法》经验,为你挑选了1个好方法。

我在覆盖基本类的静态方法方面遇到了一些问题,但整个问题非常复杂且太长(游戏引擎中资源管理的普遍化),所以这里有一个简化版本:

template
class base
{
    static void bar()
    { printf("bar"); }
public:
    static void foo()
    { bar(); }
};

class derived : public base
{
    static void bar()
    { printf("baz"); }
};

int main() { derived::foo(); }

上面的代码在我的情况下输出"bar",我希望它输出"baz".我该怎么办呢?似乎无论我尝试什么,base :: foo()总是调用base :: bar().我的设计可能有问题.我从未遇到过这个问题 - 我该如何解决?



1> YSC..:

你想要做的事情是通过简单的类继承无法实现的; 一个方法不能兼得staticvirtual.

你需要一个static能够在没有对象(实例)的情况下调用函数的方法; 你需要barvirtual使bar::foo()呼叫derived::bar()从一个调用时derived 实例.

这两个特征是相互排斥的.但奇怪的递归模板模式(CRTP)可能是一个解决方案:

#include 

template
struct base
{
    static void foo()
    {
        T::bar();
    }
};

struct derived : public base
{
    static void bar()
    {
        std::cout << "derived" << std::endl;
    }
};

int main()
{
    derived::foo();
}

实例


@MayaNedeljkovich不是。只要对`base <T> :: foo`进行了特殊化处理(在示例程序中,将精确调用`base <derived> :: foo`的准确时间),它就会_does_检查`base <T> :: foo`。对于给定的“ T”有意义。这就是所谓的模板第二遍编译(也称为“在推论上下文中”)。如果不是这种情况,则=>编译错误。[自行尝试](http://coliru.stacked-crooked.com/a/4468b8dcdd5d54c7)。
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有