Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何使用可选参数编写Q_可调用函数? 这是我的C++函数< /p>_Qt_Qml - Fatal编程技术网

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
这正是你想要的,但我只建议在其他答案无法使用的情况下这样做