2012-11-07 7 views
3

간단한 신호/슬롯 시스템을 C++로 만들지는 않으나 매개 변수와 함께 사용하려고하면 몇 가지 문제가 있습니다. 여기에 내 코드는std :: function 및 Signal/Slot system

입니다.

내 신호 클래스 :

template <typename T> 
class Signal 
{ 
private: 
    typedef std::function<T> Slot; 

public: 
    Signal(); 

    void connect(Slot slot); 
    void emit(T data); 
    void emit(); 

private:  
    std::vector<Slot> slots;  
}; 

내 테스트 클래스 : 그래서

class Object 
{ 
public: 
    Object(); 
    void sayHello( int i ); 
}; 

, 내 클래스를 사용 그런 :

Signal<void(int)> signal; 
signal.connect(std::bind(&Object::sayHello, player, std::placeholders::_1)); 
signal.emit(0); 

내가 Signal.cpp에 경고를 가지고 : 후보의 기능을 가능한하지 : 1 인수에 대해 '무효 (*) (int)를'INT '로부터 알려진 변환; 이 코드에서

:

template <typename T> 
void Signal<T>::emit(T data) 
{ 
    typename std::vector<Slot>::iterator i; 
    Slot t; 

    for(i = this->slots.begin(); i != this->slots.end(); i++) 
    { 
     t = (*i); 
     t(data); // Here 
    } 
} 

나는 그것을 해결할 수 있습니까? "emit"메서드에 객체 또는 다중 값 매개 변수를 지정하려면 hoc을 할 수 있습니까?

감사합니다.

template <typename T> 
    // ... 
    typedef std::function<T> Slot; 
    // ... 
    void emit(T data); 

그리고 당신의 신호의 선언 :

Signal<void(int)> signal; 

는 대답은 아주 명백해야한다 : void emit(T)void(int)로 변환 같은 void emit(void(*)(int)) (기능 유형이됩니다 당신의 Signal 클래스의 세 줄을 따기

+0

[http://liveworkspace.org/code/2d733163b1af460eedcf05a7fb760608]이 (가) 시도한 내용입니까? 당신은'T' =='void (int)'를 지정하고 있지만'emit'는'T' =='int'를 기대합니다. – ildjarn

+0

Oups! 고마워, 그걸로 더 잘 작동 :) – Dono

답변

5

포인터가 함수 매개 변수 일 때).

나는 단지 T<Signature>을 사용하는 모든 클래스 템플릿과 동일한 방식으로 진행하는 것이 좋습니다 : 부분 전문화.

template<class Sig> 
class Signal; 

template<class R, class... Args> 
class Signal<R(Args...)>{ 
    // ... 
    typedef std::function<R(Args...)> Slot; 
    // ... 
    void emit(Args... args) const{ 
    // iterate over slots and call them, passing `args...` 
    } 
}; 
+0

'emit'은 어쨌든 어떤 타입의 리턴 타입을 사용하지 않는 것처럼 보이므로 아마도'void'라고 가정해야할까요? – ildjarn

+0

@ildjarn : 나는 아직도 최선의 행동 방침이 무엇인지 생각하고있다. 'void '라고 가정하면 그들 중 하나이지만, 내 대답은 많이 바뀌지 않습니다. 나는 또한 선택적으로'emit'에 전달 된 결합 자 매개 변수에 대해 생각 중이며 결과 값 (접기와 같이)을 조합하거나 어딘가에 전달합니다. – Xeo

+0

오, 고마워, 나는 여기에서 많은 것을 배웠다. 그리고 그것은 완벽하게 작동한다. D. 변수 args에 대한 자세한 내용은 C++의 템플릿을 참조하십시오. – Dono

관련 문제