2016-08-02 3 views
1

좋은 프로그래밍 방식으로 작업이 완료되면 (실패한 경우) 콜백 매개 변수를 추가하고 있습니까? 예 :작업 완료 콜백 프로그래밍 연습

template <typename F> 
void load(::std::string const& path, F&& f) 
{ 
    // after a long load 
    ::std::invoke(f, path); 
} 

여기에서 f은 다른 스레드의 컨텍스트에서 호출 될 수 있습니다. 내 질문은 프로그램에서 단발 신호/슬롯 쌍을 갖는 것이 가치가 있는지의 여부를 숙고함으로써 나온 것입니다. 즉, 한 번만 호출되는 슬롯입니다. 그렇지 않으면 지루한 것으로 간주 될 수있는 신호를 연결 한 다음 연결해야 할 수 있습니다. 이유는 bool 값과 같은 반환 값을 사용하면 결과를 기다릴 필요가 있지만 콜백을 사용하면 필요하지 않습니다.

+0

구문이 이상하게 보입니다. F가 뭐라고되어 있니? 왜 안'std :: function '? –

+0

':: std :: invoke'와 같이 호출 할 수있는 객체는 모두 – user1095108

+0

입니다. 관찰자 패턴을 사용하면 유지 보수성이 향상 될 것입니다. – adrianN

답변

2

일반적으로 나쁘지 않습니다. 이것은 Boost.Asio에서 볼 수 있듯이 비동기 프로그래밍의 상당히 기본적인 부분입니다.

Boost.Asio는 C++ 03이므로 invoke을 사용할 수 없다는 점을 제외하면 거의 모든 콜백 함수에 대해 동일한 구문을 사용합니다. 예를 들어, async_read입니다. 호출자는 소켓에서 읽고 콜백 함수가 적절하게 채워질 인수로 error_code을 취한다는 요구 사항 (템플릿을 통해 시행됨)으로 콜백 함수를 호출하도록 호출합니다.