将不同类型的QList转换为QString的静态函数
Static function to convert QList of different types to QString
我有一个包含字符串、整数、双精度和日期值的 QList。我想将 QList 转换为 QString 并在 QString returning 函数中 return 它。有没有我可以使用的静态函数,或者我在这里缺少什么?我当前的代码:
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 的意思是 "built-in" 当他或她写 "static"
可以使用内置函数删除 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
表示 "use QStringList::push_bask
to record the results"。如果 QStringList
有一个 resize(int)
像 QVector
那样,我们可以用 aggregate.begin()
代替。
一元函数有点棘手,因为它需要转换成一元函数,这就是std::bind
/std::mem_fn
所做的。如果您使用的是 C++11,则可以改用 lambda。
同样从上一个问题来看,@SingerOfTheFall 的评论是有效的:
I also find it a little odd to save transactions inside of products. A
better design would be having a separate class that could store them.
如果保留此设计,Transaction Product::at(int)
和 int Product::size()
应重命名以使 link 和 Transaction
显式显示,如 getTransaction
和 getNumberOfTransactions
.
我有一个包含字符串、整数、双精度和日期值的 QList。我想将 QList 转换为 QString 并在 QString returning 函数中 return 它。有没有我可以使用的静态函数,或者我在这里缺少什么?我当前的代码:
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 的意思是 "built-in" 当他或她写 "static"
可以使用内置函数删除 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
表示 "use QStringList::push_bask
to record the results"。如果 QStringList
有一个 resize(int)
像 QVector
那样,我们可以用 aggregate.begin()
代替。
一元函数有点棘手,因为它需要转换成一元函数,这就是std::bind
/std::mem_fn
所做的。如果您使用的是 C++11,则可以改用 lambda。
同样从上一个问题来看,@SingerOfTheFall 的评论是有效的:
I also find it a little odd to save transactions inside of products. A better design would be having a separate class that could store them.
如果保留此设计,Transaction Product::at(int)
和 int Product::size()
应重命名以使 link 和 Transaction
显式显示,如 getTransaction
和 getNumberOfTransactions
.