gpt4 book ai didi

c++ - 非模板类中没有 T 参数的模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:39 25 4
gpt4 key购买 nike

好吧,我在这里和那里阅读了很多关于这个问题的答案,但可能是因为我不知道正确的语法,所以我不知道该怎么做。

我有一个非模板类,它必须实现不同的静态实用函数,主要用于序列化和反序列化。我目前拥有的是这样的:

class Data_Base : public QObject
{
...
protected:
static QByteArray Serialize(int value);
static int DeserializeInt(QByteArray ser);
static QByteArray Serialize(char *value);
static char *DeserializeCharArr(QByteArray ser);
static QByteArray Serialize(QString value);
static QString DeserializeQString(QByteArray ser);
....
}

现在,我更愿意将所有 Deserialize* 函数作为模板,因为这样会更好。作为奖励,还有 Serialize 函数作为模板,所以我会强制用户明确说明要调用哪个重载。可以这样使用的东西:

QByteArray ba = Serialize<int>(5);
...
int theValue = Deserialize<int>(ba);

现在,我尝试了不同的方法,但由于我看到的所有函数都只是自动实现模板的示例,一次没有一个重载,所以我无法找到如何实现这一点。

当然这是 C++,添加了 QT。

最佳答案

如评论中所述,它称为模板特化,如下所示:

class X
{
public:
template<typename T>
static QByteArray Serialize(T const& t);

template<typename T>
static T Deserialize(QByteArray& v);
};

template<>
QByteArray X::Serialize(int const& t)
{
/* ... */
}

template<>
QByteArray X::Serialize(QString const& t)
{
/* ... */
}

template<>
int X::Deserialize(QByteArray& v)
{
/* ... */
}

template<>
QString X::Deserialize(QByteArray& v)
{
/* ... */
}

QByteArray x=X::Serialize(5);
int y=X::Deserialize<int>(x);

当使用 Serialize 时,您不需要指定模板参数,因为它可以从参数的类型。

但是不能通过返回类型推导,所以在使用Deserialize时需要添加模板参数。

关于c++ - 非模板类中没有 T 参数的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39327547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com