gpt4 book ai didi

c++ - QVariant 中的自定义类型转换为空字符串

转载 作者:行者123 更新时间:2023-12-02 19:54:20 27 4
gpt4 key购买 nike

我正在编写一个词法扫描器,它可以根据某些输入生成标记流。这些 token 具有类型。由于我使用的是 Qt,因此我选择将 token 数据存储为 QVariant。这对于非自定义类型的 token 数据非常有效。

不幸的是,我有几种自定义类型也存储在 token 内。 token 有一个 toString() 函数,用于输出 token 描述(用于调试),但对于具有自定义类型数据的所有 token ,此函数给出一个空字符串。代码如下:

测试.h:

struct Test
{
QString value_;

Test(const QString& value = "");
QString toString();
};

Q_DECLARE_METATYPE(Test)

Token.h:

struct Token
{
TokenType type_;
QVariant value_;
...
virtual QString toString() const;
};

Token.cpp:

QString Token::toString() const
{
QStringList sl;
sl << "Token(" << ::toString(type_) << ", ";
sl << value_.toString() << ")";
return sl.join("");
}

扫描仪输出示例:

"Token(TT_TEST, )" 
"Token(TT_PLUS, +)"
"Token(TT_NUMBER, 5)"
"Token(TT_end, #)"

TT_TEST 标记包含一个 Test 类,我希望变体打印它的值。不幸的是这不起作用,我尝试了很多解决方案都不起作用。我当前的解决方法如下所示:

template <typename T>
bool writeToStringList(QStringList& sl, QVariant v)
{
if (!v.canConvert<T>()) return false;
sl << v.value<T>().toString();
return true;
}

以及修改后的toString()函数:

sl << "Token(";
sl << ::toString(type_) << ", ";
if (!writeToStringList<Test>(sl, value_)) {
sl << value_.toString();
}

我必须对所有自定义类型执行此操作,这感觉非常笨拙和错误。

我认为必须有更好的解决方案来解决这个问题。你们中的任何人都可以吗:

  • 告诉我如何以更好的方式解决 QVariant 的问题,或者
  • 建议一个完全不同的解决方案,无需使用QVariant。 (我之前有一个模板解决方案,但我在那里遇到了不同的问题,所以如果建议的话我需要一个示例)。

最佳答案

Q_DECLARE_METATYPE() 实际上足以在 QVariant 中启用自定义类型的聚合。但这不包括隐式类型转换和 QVariant 上下文中的比较等方面。假定为 Qt5,为了促进到 QString 的隐式转换,您可以执行以下操作:

#include <QMetaType>

struct Token {
QString _value;
};

Q_DECLARE_METATYPE( Token* );

QString tokenToString( Token* t ) {
return t->_value );
}

int main(int argc, char* argv[]) {
QMetaType::registerConverter<Token*,QString>( tokenToString );

Token t = { QString("hello") };
QVariant value;
value.setValue( &t );
std::cout << value << std::endl;
}

这当然也可以通过 Q_DECLARE_METATYPE( MyType ) 实现(并且更节省),并直接聚合 QVariant 中的 Token 实例而不是指向 Token 的指针。

另请参阅this post from the Qt forum

关于c++ - QVariant 中的自定义类型转换为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23984421/

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