【发布时间】:2016-10-04 13:53:10
【问题描述】:
我有一个带有两个类型名参数的模板方法(实际上是QObject::connect() - 请参阅this answer 和another answer)。因为类型名是针对成员指针的,所以当传入的名称引用重载函数时,推导可能会失败;发生这种情况时,我们需要将一个参数强制转换为正确的类型(可能通过将其存储到所需类型的局部变量中)或使用一个或多个模板参数来限定调用。
以其中一个链接问题为例:
QObject::connect(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
需要写成
QObject::connect<void(QSpinBox::*)(int)>(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
或(通过强制):
void(QSpinBox::*signal)(int) = &QSpinBox::valueChanged;
QObject::connect(spinBox, signal,
slider, &QSlider::setValue);
不过,有时可以推导出第一个模板参数,但需要后面的参数。有没有一种简单的方法可以默认第一个参数,但指定其他参数?我在想类似的东西
QObject::connect<auto, void(QSpinBox::*)(int)>(slider, &QSlider::valueChanged,
spinBox, &QSpinBox::setValue);
显然,这不是有效的 C++,但我希望它能说明这一点。
我知道我会写
void(QSpinBox::*slot)(int) = &QSpinBox::setValue;
QObject::connect(slider, &QSlider::valueChanged,
spinBox, slot);
但我希望语法更简洁。
【问题讨论】:
-
我认为您应该能够通过静态转换将该函数转换为您想要的指针类型。像
static_cast<void(QSpinBox::*)(int)>(QSpinBox::setValue)这样的东西。这应该允许模板参数推导起作用,因此您无需指定类型。 -
嗯,这更丑 - 我更喜欢定义一个更安全的明智的
up_cast<>()(并且对于强制?:的参数而不缩小也很有用)。
标签: c++ templates template-argument-deduction