带有模板的 QList 通用 join() 函数
QList generic join() function with template
我正在尝试为 QList 创建一个通用的 join() 函数(比如为 QStringList 创建一个 join() 函数)以便为任何类型的 QList 创建一个 toString() 函数。
该函数采用 QList、分隔符和确定如何打印项目的函数。
考虑这段代码:
#include <QList>
#include <QDebug>
template <class T>
static QString join(const QList<T> &list, const QString &separator, const std::function< QString (const T &item) > toStringFunction)
{
QString out;
for(int i = 0; i<list.size(); i++)
out+= (i ? separator : "") + toStringFunction(list[i]);
return out;
}
int main(int argc, char *argv[])
{
QList <double> list;
list<<1.<<2.<<3.<<4.;
int precision = 1;
QString out = join(list, ",",[precision](const double &item)->QString{
return QString::number(item,'f',precision);
});
qDebug()<<out;
return 1;
}
这是我遇到的错误:
src\main.cpp(18): error C2672: 'join': no matching overloaded function found
src\main.cpp(20): error C2784: 'QString join(const QList<T> &,const QString &,const std::function<QString(const T &)>)': could not deduce template argument for 'const std::function<QString(const T &)>' from 'main::<lambda_f1fd4bbd6b8532d33a84751b7c214924>'
src\main.cpp(5): note: see declaration of 'join'
显然我不关心这个功能,有很多解决方案可以做到这一点。但是我不明白我在这里使用模板做错了什么。
could not deduce template argument ???
注意:
out = join<double>(list, ",",[precision](const double &item)->QString{
return QString::number(item,'f',precision);
});
=> 工作正常
const std::function<QString(const double &item)> toStringFunction = [precision](const double &item)->QString{
return QString::number(item,'f',precision);
};
out = join(list, ",",toStringFunction);
=> 工作正常
我不确定 C++ 内部发生了什么,但它确实适用于以下声明:
template <class T>
static QString join(const QList<T> &list,
const QString &separator,
const std::function< QString (const typename QList<T>::value_type &) > toStringFunction)
我认为QList
可以通过传递的list
判断模板类型,而join
模板本身不能。
我正在尝试为 QList 创建一个通用的 join() 函数(比如为 QStringList 创建一个 join() 函数)以便为任何类型的 QList 创建一个 toString() 函数。 该函数采用 QList、分隔符和确定如何打印项目的函数。 考虑这段代码:
#include <QList>
#include <QDebug>
template <class T>
static QString join(const QList<T> &list, const QString &separator, const std::function< QString (const T &item) > toStringFunction)
{
QString out;
for(int i = 0; i<list.size(); i++)
out+= (i ? separator : "") + toStringFunction(list[i]);
return out;
}
int main(int argc, char *argv[])
{
QList <double> list;
list<<1.<<2.<<3.<<4.;
int precision = 1;
QString out = join(list, ",",[precision](const double &item)->QString{
return QString::number(item,'f',precision);
});
qDebug()<<out;
return 1;
}
这是我遇到的错误:
src\main.cpp(18): error C2672: 'join': no matching overloaded function found
src\main.cpp(20): error C2784: 'QString join(const QList<T> &,const QString &,const std::function<QString(const T &)>)': could not deduce template argument for 'const std::function<QString(const T &)>' from 'main::<lambda_f1fd4bbd6b8532d33a84751b7c214924>'
src\main.cpp(5): note: see declaration of 'join'
显然我不关心这个功能,有很多解决方案可以做到这一点。但是我不明白我在这里使用模板做错了什么。
could not deduce template argument ???
注意:
out = join<double>(list, ",",[precision](const double &item)->QString{
return QString::number(item,'f',precision);
});
=> 工作正常
const std::function<QString(const double &item)> toStringFunction = [precision](const double &item)->QString{
return QString::number(item,'f',precision);
};
out = join(list, ",",toStringFunction);
=> 工作正常
我不确定 C++ 内部发生了什么,但它确实适用于以下声明:
template <class T>
static QString join(const QList<T> &list,
const QString &separator,
const std::function< QString (const typename QList<T>::value_type &) > toStringFunction)
我认为QList
可以通过传递的list
判断模板类型,而join
模板本身不能。