2016-10-04 13 views
1

두 개의 typename 매개 변수가있는 템플릿 메서드가 있습니다 (실제로는 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); 

을 가끔하지만 , 첫 번째 템플릿 인수는 추론 될 수 있지만 나중에 필요한 인수입니다. 첫 번째 매개 변수를 쉽게 기본값으로 설정하고 다른 매개 변수를 지정하는 쉬운 방법이 있습니까? 나는이 유효 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); 

쓸 수 있습니다 알고 있지만 나는 더 간결한 구문 바라고 있어요.

+0

난 당신이 정적 캐스트와 함께 원하는 포인터 유형으로 함수를 캐스팅 할 수 있어야한다고 생각합니다. 'static_cast (QSpinBox :: setValue)'와 같은 것입니다. 템플릿 인자 공제가 작동하도록 허용해야하므로 유형을 지정할 필요가 없습니다. – NathanOliver

+0

글쎄, 그건 더 끔찍한데 - 나는 더 안전하고 ('? :'의 인자를 좁히지 않고 강요하는데 유용하다) 현명한'up_cast <>()'를 정의하는 것을 선호한다. –

답변

6

첫 번째 매개 변수를 쉽게 기본값으로 설정하고 다른 매개 변수는 쉽게 지정할 수 있습니까?

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

하거나 connect()의 다른 오버로드를 사용하고 람다 통과 :

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

번호 당신은 static_cast A를 같이 수동으로 두 번째 인수를 강요 할 것이다

+0

나는 그 대답이 아마 "아니오"라고 의심했지만, 물어 볼만한 가치가있는 것으로 보였다. 그렇다면 로컬 변수 접근법을 가장 깨끗하게 유지할 것입니다. –

+0

@TobySpeight 람다 방식의 팬이 아니십니까? – Barry

+0

특히, 주관적입니다. 나는 코드 리뷰에서 그것을 반대하지 않을 것이지만, 나는 거의 그것을 직접 작성하지 않을 것이다. 아마 나는 실제로 그런 람다보다 훨씬 더 많은 오버 헤드를 상상하고있다! 연결 유형 인수를 'auto'에서 'direct'로 미묘하게 변경 했으므로 여기서주의해야합니다. UI와 같은 UI 연결에는 문제가되지 않지만 문제는 크로스 스레드 일 수 있습니다. –