Tob*_*ght 1 c++ templates argument-deduction
我有一个带有两个typename参数的模板方法(实际上是QObject::connect()- 看到这个答案和另一个答案).因为类型名是针对成员指针的,所以当传入的名称引用重载函数时,演绎可能会失败; 当发生这种情况时,我们需要将一个参数强制转换为正确的类型(可能通过将其存储到所需类型的局部变量中)或者使用一个或多个模板参数限定调用.
以一个相关问题为例:
QObject::connect(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
Run Code Online (Sandbox Code Playgroud)
需要写成
QObject::connect<void(QSpinBox::*)(int)>(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
Run Code Online (Sandbox Code Playgroud)
或(通过胁迫):
void(QSpinBox::*signal)(int) = &QSpinBox::valueChanged;
QObject::connect(spinBox, signal,
slider, &QSlider::setValue);
Run Code Online (Sandbox Code Playgroud)
但是,有时可以推导出第一个模板参数,但后面的参数是必需的.是否有一种简单的方法来默认第一个参数,但是指定其他参数?我在想类似的东西
QObject::connect<auto, void(QSpinBox::*)(int)>(slider, &QSlider::valueChanged,
spinBox, &QSpinBox::setValue);
Run Code Online (Sandbox Code Playgroud)
显然,这不是有效的C++,但我希望它说明了这一点.
我知道我可以写
void(QSpinBox::*slot)(int) = &QSpinBox::setValue;
QObject::connect(slider, &QSlider::valueChanged,
spinBox, slot);
Run Code Online (Sandbox Code Playgroud)
但我希望有一个更简洁的语法.
是否有一种简单的方法来默认第一个参数,但是指定其他参数?
不,你只需要手动强制第二个参数,比如static_cast:
QObject::connect(slider, &QSlider::valueChanged,
spinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::setValue));
Run Code Online (Sandbox Code Playgroud)
或者只是使用不同的重载connect()并传递lambda:
QObject::connect(slider, &QSlider::valueChanged,
[&spinBox](int i){ spinBox.setValue(i); });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |