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

Posted

技术标签:

【中文标题】预期类型更改时如何获得编译器错误【英文标题】:How to get a compiler error when expected type changes 【发布时间】:2017-05-16 01:53:20 【问题描述】:

我的应用中有一些代码以简化形式显示:

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。但是当像这样更改类型时,我宁愿得到一个编译器错误。如果将来函数的返回发生变化,我该如何更改它以便我得到编译器错误?

【问题讨论】:

您想特别检查pDevice->Type() 的类型,还是一般的功能更改? 只要它是有效的 C++,编译器就会愉快地编译它。你需要的是Unit Tests! 【参考方案1】:

最简单的解决方法是在代码中为返回的Type() 值包含一个static_assert。但是,当然,您不希望到处都这样做。

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

【讨论】:

【参考方案2】:

你可以使用独立的函数:

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 的东西,代码就可以工作。你也可以静态断言 Type() 返回 QString。

【讨论】:

以上是关于预期类型更改时如何获得编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

mex 编译错误:Matlab 数据类型和函数的预期表达式错误

SwiftUI UIPageView 编译错误和操作表问题

Xcode: 错误:对于函数式的转换或类型构造,预期'('。

如果C代码比较不同的数据类型,如何获得警告?

Typescript 编译器错误预期带有 Angular 1.5 组件的分号

从 HANDLE 到 ULONG C++ 的类型转换截断