如何初始化QStrings的常量QSet

时间:2016-12-17 22:44:32

标签: c++ qt

对于一个小测试,我想初始化一个QSet,其中一些令牌使用C ++存储为QString。有没有一种简单的方法在C ++中做这样的事情?

#include <iostream>
#include <QSet>
#include <QString>

const QString TK_IDENT = "ID";
const QString TK_DESC  = "DESC";
const QString TK_SPEC  = "SPEC";

// THIS STUFF AS A ONELINER
const QSet<QString> TOKEN(TK_IDENT, TK_DESC, TK_SPEC);

int main(int argc, char *argv[]) {
 bool NOK = TOKEN.contains("TEST");
 bool OK  = TOKEN.contains("IDENT");
 std::cout << NOK << std::endl;
 std::cout << OK << std::endl;
 return 0;
}

3 个答案:

答案 0 :(得分:4)

当你查看QSet的文档时,你会发现它有一个std::initializer_list的ctor。因此,使用统一初始化语法,写:

const QSet<QString> TOKEN{TK_IDENT, TK_DESC, TK_SPEC};

由于这些是C ++ 11特性,因此您需要一个C ++ 11编译器。此外,必须相应地编译Qt。据我记得,在Qt 4.8 5.1中添加了initializer_list ctors。 (更新:Igor的评论是正确的:像QStringList这样的类在4.8中获得了它们的初始列表ctor,QSet在5.1中获得了它。)

答案 1 :(得分:3)

如果您不幸并且没有支持C ++ 11的环境,您可以创建一个列表

import breeze.linalg.{DenseMatrix, inv}

val mx = new DenseMatrix(a1, b1, x.transpose.flatten)
val my = new DenseMatrix(a2, b2, y.transpose.flatten)

mx * inv(my)

答案 2 :(得分:1)

另请注意,标记应为QString文字,以免过早地使代码失望。 QStringLiteral就是它在框中所说的:一种机制,它使用编译器在编译时生成QString的内部数据结构,而不必通过UTF8到UTF16运行时的转换和字符串实例化:

const auto TK_IDENT = QStringLiteral("ID");
const auto TK_DESC  = QStringLiteral("DESC");
const auto TK_SPEC  = QStringLiteral("SPEC");

const QSet<QString> TOKEN{TK_IDENT, TK_DESC, TK_SPEC};