2つのtypenameパラメータを持つテンプレートメソッドがあります(実際にはQObject::connect()
- this answerとanother answerを参照)。型名はメンバポインタ用であるため、渡された名前がオーバーロードされた関数を参照すると、控除が失敗する可能性があります。そのような場合は、1つの引数を正しい型に強制したり(おそらく、それを目的の型のローカル変数に格納することによって)、あるいは1つ以上のテンプレートパラメータで呼び出しを修飾する必要があります。最初のテンプレートパラメータをデフォルトに設定できますか?
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(QSpinBox :: setValue)'のようなものです。テンプレート引数の控除が機能するようにして、型を指定する必要はありません。 –
NathanOliver
さて、それはさらに醜いです。私は、より安全な意味のある 'up_cast <>()'を定義することを好みます(狭くすることなく '?:'の引数を強制するのにも便利です)。 –