如何避免使用类型名称类型

时间:2015-04-06 23:11:47

标签: c++ qt templates

我的基类中有一个声明:

template<class PROTOCOL>
static Packet* serialize(uint packetId, QVariantHash data = QVariantHash());

然后当我从基类继承时,我可以像这样使用静态方法:

GameProtocol::serialize<GameProtocol>(0); // This works fine

我的问题是,为了使调用GameProtocol::serialize(0)有效,我需要做些什么改变(即没有模板声明)。

我想保持方法静态,因为它简化了基类的其他区域。我理解这很难,因为静态方法不能在C ++中被覆盖,但肯定必须有一种使用模板魔法的方法。

2 个答案:

答案 0 :(得分:1)

似乎GameProtocol碰巧是你的派生类:只需添加一个static方法serialize(),它转发到适当的基类版本:

class GameProtocol: public Protocol {
    // ...
public:
    static Packet* serialize(uint id,
        QVariantHash h = QVariantHash()) {
        return Protocol::serialize<GameProtocol>(id, h);
    }
    // ...
};

答案 1 :(得分:0)

只需在GameProtocol类中编写另一个封装模板函数的函数:

static Packet* serialize(int packetId, QVariantHash data = QVariantHash()) {
    return serialize<GameProtocol>( packetId, data );
}

现在你可以摆脱模板:

GameProtocol::serialize(0);