2014-01-28 8 views
1

더 유용한 프로그래밍 스타일을 채택하여 모듈 식 및 재사용 가능한 구성 요소로 임시 프로그램을 추출하려고하지만 모든 것을 두 번 쓸 수 있습니다.C++ 함수 개체 템플릿 인수 공제 스타일

예를 들어 구성 가능한 함수 개체 step에 의해 업데이트되는 상태 인 stateT state이 있습니다. 나는이 make_stepper

template<typename sT, typename T1, typename T2> 
auto make_stepper(sT state, T1 func1, T2 func2) { 
    return Step<sT,T1,T2>(func1, func2); 
} 

을 한

auto step = Step<stateT,typename_of_func1,typename_of_func2>{func1, func2}; 

입력 할 필요가 없습니다 것이다 그래야

template<typename sT, typename T1, typename T2> 
struct Step { 
    T1 func1; 
    T2 func2; 

    Step(T1 f1, T2 f2) : func1(f1), func2(f2) {} 

    sT operator()(sT state) { 
    state.A = func1(state.A); 
    ... using func2() and internals of state ... 
    } 
}; 

지금은

stateT state{...constructor arguments...}; 
auto step = make_stepper(state, func1, func2); 
state = state(step); 

멋진 인터페이스를 제공하기 위해 쓸 수 있습니다 나는을 쓰는 것을 끝내었다.은 모든 템플릿 기능 객체 X에 대한 함수입니다. 이 스타일이 좋은가요 아니면 그냥 속이는거야? make_X 함수 작성을 피할 수 있습니까? 또는 전체 접근 방식을 변경해야합니까?

+0

'자동'의 재 해석 이후, 실제로 상황은 이전보다 훨씬 더 좋게되었습니다. – molbdnilo

+2

만들어진 복사본의 수를 제한하려면'make_stepper'에서 ** perfect forwarding **을 사용해야합니다. – MFH

+0

@MFH : 이전의 [질문] (http://stackoverflow.com/questions/21230320/what-is-the-correct-argument-type-for-a-function-object)을 참조하십시오. – Mankka

답변

2

정상적으로 수행되는 방식이며 C++ 표준 라이브러리에서도 마찬가지입니다. 그래서 당신은 올바른 길을 가고 있으며 make_ 함수 작성을 피할 방법이 없습니다. 클래스/구조체에 대해 직접 요청한 방식으로 공제가 작동 할 방법이 없기 때문입니다.

관련 문제