将不同类型的QList转换为QString的静态函数

Static function to convert QList of different types to QString

本文关键字:QString 静态函数 转换 QList 同类型      更新时间:2023-10-16

我有一个QList,其中包含字符串,int, double和日期值。我想将QList转换为QString并在QString返回函数中返回它。有一个静态函数,我可以使用或我错过了什么?我当前的代码:

QString Product::toString()
{
    QStringList listString;
    QString outString;
    for(int i =0; i < size(); i++)
    {
        listString << at(i)->toString();
    }
    outString = listString.join("n");
    return outString;
}

备注:

  • 我假设Product::at(int)返回Transaction,给定前面的问题。

  • 我也假设OP的意思是"内置"当他或她写"静态"

for可通过内置功能移除。不过,有些人(很多人?)会觉得新语法不太容易理解。

QString Product::toString()
{
    QStringList aggregate;
    std::transform(m_transactions.begin(),
                   m_transactions.end(),
                   std::back_inserter(aggregate),
                   std::bind(std::mem_fn(&Transactions::toString), std::placeholders::_1));
                   // or : [](const Transaction& transaction){ return transaction.toString(); });
    return aggregate.join("n");
}

std::transform将使用Transaction::toString()转换每个m_transactions元素,并将结果放入aggregate

std::back_inserter表示"使用QStringList::push_bask记录结果"。如果QStringListQVector一样有resize(int),我们可以用aggregate.begin()来代替。

一元函数有点棘手,因为它需要被转换成一元函数,这是std::bind/std::mem_fn正在做的。如果你使用的是c++ 11,你可以使用lambda来代替。


同样来自上一个问题,@SingerOfTheFall的评论是有效的:

我也觉得在产品内部保存交易有点奇怪。一个更好的设计是有一个单独的类来存储它们。

如果你保持这个设计,Transaction Product::at(int)int Product::size()应该重命名,使Transaction的链接显式,就像getTransactiongetNumberOfTransactions