Qt 如何使用可选参数编写Q_可调用函数? 这是我的C++函数< /p>
头文件:Qt 如何使用可选参数编写Q_可调用函数? 这是我的C++函数< /p>,qt,qml,Qt,Qml,头文件: Q_INVOKABLE void setSelection(qint64 start, qint64 end, qint64 init); 正文文件: void SelectionModel::setSelection(qint64 start, qint64 end, qint64 init) { ... } 如何将init参数修改为可选参数,以便 (A) 我可以从JavaScript调用函数,如下所示: setSelection(0, 10, 4) setSelect
Q_INVOKABLE void setSelection(qint64 start, qint64 end, qint64 init);
正文文件:
void SelectionModel::setSelection(qint64 start, qint64 end, qint64 init) {
...
}
如何将init
参数修改为可选参数,以便
(A)
我可以从JavaScript调用函数,如下所示:
setSelection(0, 10, 4)
setSelection(0, 10)
(B)
< >我可以在C++代码中找到是否已经通过了<代码> init /Cuth>参数。 可以添加一个重载,如:
Q_INVOKABLE void setSelection(qint64 start, qint64 end);
Q_INVOKABLE void setSelection(qint64 start, qint64 end, qint64 init);
重载实现:
void SelectionModel::setSelection(qint64 start, qint64 end) {
//here you know init hasn't been passed ...
setSelection(start, end, 0);
}
可以添加重载,如下所示:
Q_INVOKABLE void setSelection(qint64 start, qint64 end);
Q_INVOKABLE void setSelection(qint64 start, qint64 end, qint64 init);
重载实现:
void SelectionModel::setSelection(qint64 start, qint64 end) {
//here you know init hasn't been passed ...
setSelection(start, end, 0);
}
A) 将默认值设置为第三个参数即可:
Q_INVOKABLE void setSelection(qint64 start, qint64 end, qint64 init = 0);
B) 您无法区分,尽管有一个技巧可以将默认值设置为绝对不应采用的值,例如,如果输入值为正值,则可以设置默认值-1,以便进行区分。a)将默认值设置为第三个参数就足够了:
Q_INVOKABLE void setSelection(qint64 start, qint64 end, qint64 init = 0);
B) 您无法区分,尽管有一个技巧可以作为默认值设置为不应采用的值,例如,如果输入值为正值,则您可以设置默认值-1,以便进行区分。其他两个答案都很好。要点是,如果默认参数已经通过,则不能在C++中知道。 有时,您可以牺牲所用类型范围的某些部分来检测默认值:
void f(int somethingthat shouldbeepositive=-1)
使用C++17,我们现在有了一种新的机制,可以在不牺牲范围的情况下处理此类情况:
void f(std::optional<int> a = std::optional<int>()) {
if (!a.has_value()) {
// f was called like this: f()
} else {
// f was called like this f(-1) or f(10)
}
}
生成以下输出:
void __cdecl Object::f(int,int)
void __cdecl Object::f(int,int,class std::optional<int>) 1 1 false
void __cdecl Object::f(int,int,int) 1 2 3
void __cdecl Object::f(int,int,class std::optional<int>) 1 2 true
void\uu cdecl对象::f(int,int)
void _cdecl对象::f(int,int,class std::可选)1 1 false
void\uu cdecl对象::f(int,int,int)1 2 3
void\uu cdecl对象::f(int,int,class std::可选)1 2 true
这正是您想要的,但我只建议在其他答案无法使用时才这样做。其他两个答案都很好。要点是,如果默认参数已经通过,则不能在C++中知道。 有时,您可以牺牲所用类型范围的某些部分来检测默认值:
void f(int somethingthat shouldbeepositive=-1)
使用C++17,我们现在有了一种新的机制,可以在不牺牲范围的情况下处理此类情况:
void f(std::optional<int> a = std::optional<int>()) {
if (!a.has_value()) {
// f was called like this: f()
} else {
// f was called like this f(-1) or f(10)
}
}
生成以下输出:
void __cdecl Object::f(int,int)
void __cdecl Object::f(int,int,class std::optional<int>) 1 1 false
void __cdecl Object::f(int,int,int) 1 2 3
void __cdecl Object::f(int,int,class std::optional<int>) 1 2 true
void\uu cdecl对象::f(int,int)
void _cdecl对象::f(int,int,class std::可选)1 1 false
void\uu cdecl对象::f(int,int,int)1 2 3
void\uu cdecl对象::f(int,int,class std::可选)1 2 true
这正是你想要的,但我只建议在其他答案无法使用的情况下这样做