【问题标题】:QList generic join() function with template带有模板的 QList 通用 join() 函数
【发布时间】:2019-09-11 13:12:25
【问题描述】:

我正在尝试为 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'

显然我不关心这个功能,有很多解决方案可以做到这一点。但我不明白我在这里的模板做错了什么。

无法推断出模板参数???

注意:

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);

=> 工作正常

【问题讨论】:

  • join&lt;double&gt; 工作吗?
  • 是的 join&lt;double&gt; 工作正常

标签: qt templates function-pointers qlist


【解决方案1】:

我不确定 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 模板本身不能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多