두 개의 typename 매개 변수가있는 템플릿 메서드가 있습니다 (실제로는 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);
을 가끔하지만 , 첫 번째 템플릿 인수는 추론 될 수 있지만 나중에 필요한 인수입니다. 첫 번째 매개 변수를 쉽게 기본값으로 설정하고 다른 매개 변수를 지정하는 쉬운 방법이 있습니까? 나는이 유효 C++ 아니다, 분명히
QObject::connect<auto, void(QSpinBox::*)(int)>(slider, &QSlider::valueChanged,
spinBox, &QSpinBox::setValue);
같은 것을 생각했다, 그러나 나는 점을 보여 바랍니다.
은 내가
void(QSpinBox::*slot)(int) = &QSpinBox::setValue;
QObject::connect(slider, &QSlider::valueChanged,
spinBox, slot);
쓸 수 있습니다 알고 있지만 나는 더 간결한 구문 바라고 있어요.
난 당신이 정적 캐스트와 함께 원하는 포인터 유형으로 함수를 캐스팅 할 수 있어야한다고 생각합니다. 'static_cast (QSpinBox :: setValue)'와 같은 것입니다. 템플릿 인자 공제가 작동하도록 허용해야하므로 유형을 지정할 필요가 없습니다. –
NathanOliver
글쎄, 그건 더 끔찍한데 - 나는 더 안전하고 ('? :'의 인자를 좁히지 않고 강요하는데 유용하다) 현명한'up_cast <>()'를 정의하는 것을 선호한다. –