在使用QString的arg方法时,是一件很方便的事情,例如:
QString("%1,2%").arg("10").arg("20") //10,20
但是如果是下面的场景,对于这样场景我们期望得到的结果是:%2,20。
QString("%1,%2").arg("%2").arg("20") //20,20
实际中肯定不会这么简单啦,因为arg()方法的参数在运行期间有可能是任何值,所以当含有%1,%2...等内容时产生的结果并不是我们所期望的,但是这类的问题又很难察觉到。
所以针对这种使用场景,封装了一个arg()方法,完美的避开了上面的问题
QStringEx.hpp
#ifndef QSTRINGEX_HPP
#define QSTRINGEX_HPP
#include <QString>
class QStringEx : public QString
{
public:
QStringEx(const QString &strFormate): QString(strFormate){}
QStringEx(){}
template<typename ...Args>
QStringEx& stringArg(Args... args)
{
return stringArg(1, args...);
}
private:
template<typename T, typename ...Args>
QStringEx& stringArg(int nNumber, T arg, Args... args)
{
stringArg(nNumber + 1, args...);
return stringReplace(nNumber, arg);
}
template<typename T>
QStringEx& stringArg(int nNumber, T arg)
{
return stringReplace(nNumber, arg);
}
template<typename T>
QStringEx& stringReplace(int nNumber, T arg)
{
QString strNumber = QString("%%1").arg(nNumber);
int index = this->indexOf(strNumber);
if (index != -1)
{
this->replace(index, strNumber.length(), QString("%1").arg(arg));
}
return *this;
}
};
#endif //QSTRINGEX_H
使用:
QStringEx("%1,%2").stringArg("10", 20) //10,20
QStringEx("%1,%2").stringArg("%2", "20") //%2,20