간단한 신호/슬롯 시스템을 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
클래스의 세 줄을 따기
[http://liveworkspace.org/code/2d733163b1af460eedcf05a7fb760608]이 (가) 시도한 내용입니까? 당신은'T' =='void (int)'를 지정하고 있지만'emit'는'T' =='int'를 기대합니다. – ildjarn
Oups! 고마워, 그걸로 더 잘 작동 :) – Dono