使用除QString之外的其他类型作为文字

时间:2017-08-10 08:15:54

标签: c++ qt qt5

我刚刚了解了QStringLiteral以及它是如何运作的。这将QString的所有成员都放入我的可执行文件中并返回一个const引用。这不会调用QString构造函数。

现在,出于好奇,我想知道我是否可以将此功能应用于其他数据类型。

我想看一些QDateTimeLiteral,QTransformLiteral或QRegularExpressionLiteral(Maybe all of these types?)。

这是否与QStringLiteral一样有意义,是否易于实现?或者是否有可用的Qt fork为我提供此功能?

我认为隐式共享数据持有者可能存在问题,对吧?

1 个答案:

答案 0 :(得分:1)

如果您希望看到这样的文字,以便您可以“免费”构建对象,即在编译时,那么C ++ 11中的constexpr等效适用于任何支持它的类型。

Qt也有Q_DECL_CONSTEXPR使你更容易,因为如果你的编译器支持它,它将扩展到constexpr,但如果没有,则会跳过它。从Qt 5.5开始,您还有Q_DECL_RELAXED_CONSTEXPR来检查您的编译器是否支持C ++ 14。

另请注意QStringLiteral以类似的方式工作:如果您没有启用C ++ 11,它实际上不是文字 - 它依赖于QString::fromUtf8(),因为它依赖在lambdas上。

从Qt 5.1开始,他们一直在向某些对象添加constexpr说明符,因此获取文字的最简单方法就是尝试构造一些对象constexpr并查看它是否可用于它。我不知道任何其他选项 - 例如你提到的对象的构造函数将带有非平凡构造函数的对象作为参数,所以我认为不可能为它们创建文字版本。所有这些都应该是文字,以便它可以工作:例如在QDateTime的情况下,QDateQTime也必须具有其文字版本,因为构造函数将它们作为参数。有些对象本质上不能成为文字,因为它们依赖于动态分配 - 对于其他每个对象,您必须编写一个文字宏。在QStringLiteral的情况下,创建一个文字宏更容易,因为QString的构造函数只接受一个char数组作为参数。

顺便说一下,为什么他们决定将QStringLiteral写成宏而不是让QString构造函数中的一个成为constexpr,这让我很困惑。