【问题标题】:Can I default the first template parameter?我可以默认第一个模板参数吗?
【发布时间】:2016-10-04 13:53:10
【问题描述】:

我有一个带有两个类型名参数的模板方法(实际上是QObject::connect() - 请参阅this answeranother 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&lt;void(QSpinBox::*)(int)&gt;(QSpinBox::setValue) 这样的东西。这应该允许模板参数推导起作用,因此您无需指定类型。
  • 嗯,这更丑 - 我更喜欢定义一个更安全的明智的up_cast&lt;&gt;()(并且对于强制?:的参数而不缩小也很有用)。

标签: c++ templates template-argument-deduction


【解决方案1】:

有没有一种简单的方法可以默认第一个参数,但指定其他参数?

没有。你只需要手动强制第二个参数,比如static_cast

QObject::connect(slider, &QSlider::valueChanged,
    spinBox, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::setValue));

或者只是使用 connect() 的不同重载并传递一个 lambda:

QObject::connect(slider, &QSlider::valueChanged,
    [&spinBox](int i){ spinBox.setValue(i); });

【讨论】:

  • 我怀疑答案可能是“否”,但似乎值得一问。那么,我将坚持使用局部变量方法作为最干净的方法。
  • @TobySpeight 不喜欢 lambda 方法?
  • 不是特别是,但这是主观的。我不会在代码审查中反对它,但我也很少自己编写它。可能我想象的开销比这种 lambda 实际产生的开销要多得多!您确实需要在这里小心,因为您已经巧妙地将连接类型参数从“自动”更改为“直接” - 这在 UI->UI 连接中不是问题,但可能是跨线程问题。
猜你喜欢
  • 1970-01-01
  • 2012-06-01
  • 2012-07-25
  • 2014-11-06
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2012-08-07
相关资源
最近更新 更多