2014-07-09 3 views
2

나는 노 인수 무효을 반환하는 함수 객체로 작업하는 템플릿 클래스 작성했습니다 :함수 객체로 작업하도록 작성된 클래스도 람다 또는 std :: function 유형으로 작동 할 수 있습니까?

//...Class declaration here... 

template<class FunctionObject> 
Alarm<FunctionObject>::Alarm(const FunctionObject& fn) 
    : StopWatch(), _delegate(fn), _tickTime(1.0), _run_count(-1) { /* DO NOTHING */ } 

template<class FunctionObject> 
Alarm<FunctionObject>::Alarm(double tickTime, const FunctionObject& fn) 
    : StopWatch(), _delegate(fn), _tickTime(tickTime), _run_count(-1) { /* DO NOTHING */ } 

template<class FunctionObject> 
Alarm<FunctionObject>::Alarm(double tickTime, int run_count, const FunctionObject& fn) 
    : StopWatch(), _delegate(fn), _tickTime(tickTime), _run_count(run_count < -1 ? -1 : run_count) { /* DO NOTHING */ } 

template<class FunctionObject> 
Alarm<FunctionObject>::~Alarm() { 
    if(_isRunning) Stop(); 
} 

template<class FunctionObject> 
FunctionObject Alarm<FunctionObject>::Tick() { 
    if(IsRunning() == false) return _delegate; 

    if(GetElapsedTimeInSeconds() >= _tickTime) { 
     Reset(); 
     if(_run_count == 0) return _delegate; 
     _delegate(); 
     if(_run_count > -1) --_run_count; 
     Start(); 
    } 
    return _delegate; 
} 

을 할 사용자가 람다 또는 std::function 전달하려고하면이 작품?

그렇지 않다면 람다를 사용하는 생성자를 단순히 추가하는 것처럼 보이지 않습니다 (심지어 가능합니까?) 또는 std::function도 작동합니다.

+0

후행 기본 매개 변수를 사용하지 않는 특별한 이유가 있습니까? –

+1

'std :: function'과 람다 _are_ 펑터/함수 객체. 그들은 특별하지 않습니다 (람다는 약식이며, 그 이상은 아닙니다). – Xeo

+2

표준 라이브러리 선행은 "호출 가능"을 const 참조가 아닌 값으로 전달하는 것입니다. 또한 여기서 사용법이 훌륭하게 보일지라도,'_'가 금지되어있는 많은 경우가 있으며, 간단한 규칙은 그러한 주요한'_'을 완전히 피하는 것입니다. –

답변

2

함수 객체의 클래스에서 매개 변수화 된 템플릿이므로 모든 호출 가능한 객체와 함께 작동해야합니다.

+0

void가 아닌 객체를 반환하는 것으로 의심됩니다. 반환 유형은 무시되지만 람다/std :: 함수가 인수를 가지면 오류가 발생합니까? – Casey

+0

@Casey : 왜 "무시할"것입니까? 반환 유형은 함수 유형의 일부입니다. 나는 그 문제가 무엇인지 여기에서 보지 못하고있다. 물론 그것은 우리가'_delegate'가 무엇인지 전혀 알지 못하기 때문에있을 수 있습니다. 왜 그냥 그걸보고, 보지 그래? ?? –