【发布时间】:2020-05-31 14:20:59
【问题描述】:
我正在修复我的项目中的一些声纳云问题。一个抱怨是我读取和反序列化我的应用程序设置的功能。基本上一个函数中有 50 个左右的块:
if (!m_logLevel.deserializeFromSettings(settings, HGGW_KEY_LOGLEVEL) || m_logLevel.value() <= 0 || m_logLevel.value() > 4)
{
m_logLevel.update(HGGW_DEFAULT_LOGLEVEL, 0);
m_logLevel.serializeToQSettings(settings, HGGW_KEY_LOGLEVEL);
}
成员是模板类的实例:
template <typename T>
class AwsProperty
{
public:
AwsProperty(T value, qint64 timestamp) : m_timestamp(timestamp), m_data(value){}
//other stuff, not important
}
//example:
AwsProperty<int> m_property;
我试图设计这个功能:
template <typename X>
void readAWSSettingOrPopulateDefault(AwsProperty<X> property, QString key, X default_val, QSettings settings, bool (*predicate)(X)){
if(!property.deserializeFromSettings(settings,key) || predicate(property.value())){
property.update(default_val, 0);
property.serializeToQSettings(settings, key);
}
}
尝试调用它:
this->readAWSSettingOrPopulateDefault(m_logLevel, HGGW_KEY_LOGLEVEL, HGGW_DEFAULT_LOGLEVEL, settings, [](int val){return val <= 0 || val > 4;});
产生此错误:
XXXXconfig.cpp:275: error: no matching function for call to ‘LocalConfig::readAWSSettingOrPopulateDefault(HGGWAwsPropertyInt32&, const QString&, const int&, QSettings&, LocalConfig::init(QString)::<lambda(int)>)’
this->readAWSSettingOrPopulateDefault(m_logLevel, HGGW_KEY_LOGLEVEL, HGGW_DEFAULT_LOGLEVEL, settings, [](int val){return val <= 0 || val > 4;});
XXXXconfig.cpp:275: note: mismatched types ‘bool (*)(X)’ and ‘LocalConfig::init(QString)::<lambda(int)>’
this->readAWSSettingOrPopulateDefault(m_logLevel, HGGW_KEY_LOGLEVEL, HGGW_DEFAULT_LOGLEVEL, settings, [](int val){return val <= 0 || val > 4;});
^ ^
XXXXconfig.cpp:275: note: mismatched types ‘bool (*)(X)’ and ‘LocalConfig::init(QString)::<lambda(int)>’
^
【问题讨论】:
-
如何使用模板类作为函数参数和二进制 lambda 谓词?
-
@JeJo 我将解决它的尝试添加到顶部