如何在预期类型更改时获取编译器错误

How to get a compiler error when expected type changes

本文关键字:获取 编译器 错误 类型      更新时间:2023-10-16

我的应用程序中有一些简化形式的代码:

QVariantMap deviceMap;
deviceMap.insert("Model", pDevice->Type());
QJsonDocument jsonDoc = QJsonDocument::fromVariant(deviceMap);
QString str = jsonDoc.toJson(QJsonDocument::Compact);

我刚刚发现了一个错误,有人将功能Type()从:

QString Type() const;

自:

int Type() const;

显然,Qt对此很好,只是将其转换为导致错误的JSON。但是当像这样更改类型时,我宁愿收到编译器错误。如果将来函数的返回发生变化,我如何更改此设置,以便出现编译器错误?

最简单的

解决方法是在代码中包含返回值 Type()static_assert。 但是,当然,您不想在任何地方都这样做。

static_assert( std::is_same<decltype(pDevice->Type()), QString>::value,
               "Type mismatch, expected QString" );
deviceMap.insert("Model", pDevice->Type());

您可以使用独立函数:

void insertModel(QVariantMap& deviceMap, const QString& str)
{
    deviceMap.insert("Model", str);
}
insertModel(deviceMap, pDevice->Type());

或更通用:

void insertString(QVariantMap& deviceMap, const char* key, const QString& str)
{
    deviceMap.insert(key, str);
}
insertString(deviceMap, "Model", pDevice->Type());

在这两种情况下,只要Type()返回 QString 或任何可以转换为 QString 的内容,代码就会起作用。你也可以static_assert Type(( 返回 QString。